2017-01-27 5 views
1

Ich versuche, einen dynamischen Wert (statische Zeichen) aus einer CSV-Datei in einer bestimmten Spalte zu extrahieren und den Wert auf einen anderen CSV auszugeben.'~' führt zu null Ergebnissen in Python-Skript

Das Datenelement, das ich extrahieren möchte, ist '12385730561818101591' aus dem Wert 'callback=B~12385730561818101591' in einer bestimmten Spalte.

Ich habe das folgende Python-Skript geschrieben, aber die Ausgabeergebnisse sind immer leer. Der Regex "=(~[0-9]+)" wurde validiert, um den Wert "12385730561818101591" erfolgreich herauszuziehen. Dies wurde an www.regex101.com getestet.

Wenn ich dies in Python verwende, werden in der Ausgabedatei keine Ergebnisse angezeigt. Ich habe das Gefühl, das '~' verursacht den Fehler. Als ich in der ursprünglichen CSV-Datei nach '~' suchte, wurden keine Ergebnisse gefunden, aber es ist da!

Kann die Gemeinschaft mir mit folgendem helfen:

(1) Ursache für keine Ausgabe ermitteln und überprüfen, ob ‚~‘ ist das Problem. Könnte das Problem auch die Art sein, wie ich die Reihen spalte? Ich bin mir nicht sicher, ob die Zeilen durch ";" Anstatt von ','.

import csv 
import sys 
import ast 
import re 
filename1 = open("example.csv", "w") 

with open('example1.csv') as csvfile: 

data = None 
patterns = '=(~[0-9]+)' 
data1= csv.reader(csvfile) 
for row in data1: 
    var1 = row[57] 
    for item in var1.split(','): 
     if re.search(patterns, item): 
      for data in item: 
       if 'common' in data: 
        filename1.write(data + '\n') 
filename1.close() 
+0

Können Sie erste 2-3 Zeilen Ihrer CSV-Datei enthalten? – MYGz

+0

Die Tilde verursacht keine besonderen Probleme, Ihr Muster ist falsch, das ist das Problem. Wie beschreiben Sie das B nach dem '=' in Ihrem Muster? –

+0

Um zu wissen, was das Trennzeichen ist, sehen Sie sich Ihre Datei an. –

Antwort

0

Sie regex ist für Ihr Beispiel falsch:

=(~[0-9]+) nie callback=B~12385730561818101591 passen wegen der B nach dem = und vor dem ~. Auch Sie enthalten die ~ in der einfangenden Gruppe.

Nicht sehr sicher, was Ihr Ziel ist, aber das könnte funktionieren. Geben Sie weitere Details an, wenn Sie mehr Einschränkungen haben.

=.+~([0-9]+) 

EDIT

der neuen bereitgestellten Informationen Folgende:

patterns = '=.+~([0-9]+)' 
... 
    result = re.search(patterns, item): 
    number = result.group(0) 
    filename1.write(number + '\n') 
... 

In Bezug auf Ihre Linie Split auf dem \ t (Tabulator) Sie ein Beispiel für die volle Linie zeigen sollte

+0

Hallo, ich entschuldige mich für so spät zu antworten. Mein Ziel ist einfach, '12345678910235455' aus 'Callback = B ~ 12345678910235455' zu extrahieren und in eine separate CSV-Datei zu schreiben. Es gibt ungefähr 5000 von diesen 'Callback = B ~ 12345678910235455 alle mit eindeutigen Nummern, also wollte ich' 12345678910235455 '+' \ n 'in die neue CSV-Datei schreiben. Die Spalten scheinen auch durch eine Registerkarte und kein Komma getrennt zu sein. Übrigens, kennen Sie gute Ressourcen zum Erlernen von Regex? Ich bin ein absoluter Anfänger darin. – Brandon

+0

Ich habe versucht, für Element in var1.split (',') WITH für Element in var1.split ("\ t") zu ersetzen und ich bekomme immer noch null Ergebnisse in der ausgegebenen CSV-Datei. – Brandon

+0

Die vollständige Zeichenfolge innerhalb der Spalte, die 'callback = B ~ 1234567891012' enthält, sieht wie folgt aus: '/ common/navigation /? Callback = B ~ 1234567891012'. – Brandon

0

Hier habe ich versucht, Beispielcode zu schreiben. Hoffe, das wird Ihnen bei der Lösung des Problems helfen:

import re 
str="callback=B~12385730561818101591" 
rc=re.match(r'.*=B\~([0-9A-Ba-b]+)', str) 
print rc.group(1) 
Verwandte Themen