Seit 5 Stunden: Problem mit Regex! (mehrfaches Vorkommen von Gruppen)
-
Hallo,
ich probiere jetzt seit 5 Stunden herum und komme einfach nicht weiter. Programmiersprache ist Python.
Es gibt Logdateien mit unbestimmer Anzahl an Einträgen.
1300105811 Datei7 test0 test10 1300107321 Datei7 test1 test9 1300108129 Datei7 test2 test8 1300107162 Datei7 test3 test7 1300105515 Datei7 test4 test6 1300106386 Datei7 test5 test5 1300106818 Datei7 test6 test4 1300106542 Datei7 test7 test3 1300106770 Datei7 test8 test2 1300105745 Datei7 test9 test1
Die sehen alle in etwa so aus. Grundsätzlich ist der Aufbau so, dass
es verschiedene Felder gibt, die durch \t getrennt sind. Wenn ein neuer Eintrag kommt, erkennt man das an \t\n. Es ist möglich, dass ein Eintrag sich über mehrere Zeilen erstreckt. Das heißt, dass in einem Eintrag in einem Feld ein \n vorkommen kann. Das kann jedoch niemals am Anfang eines Feldes geschehen.So, mein Problem ist jetzt das Auslesen dieser Datei.
Meine Versuche reichen von
compiled_regex = re.compile(r"(([^\t]+?\t)+?\n)+?", re.MULTILINE)
über
compiled_regex = re.compile(r"(([^\t]+?\t)+?\n)+?", re.MULTILINE)
usw...
Keine der Versionen funktioniert wie erwartet! Ich erhalte immer nur ein Feld zurück, außer ich mache das so:
compiled_regex = re.compile(r"((\S+?\t)(\S+?\t)\n)+?", re.MULTILINE)
Dann erhalte ich zwei Felder.
Die Anzahl der Felder ist aber dynamisch! Ich suche also einen Regex, mit dem ich ALLE Felder (zw. 1 und 50) in ALLEN Einträgen ermitteln kann.
ich komme jedenfalls nicht mehr weiter.
Habt ihr eine Idee?
-
Warum willst du da überhaupt eine RegEx verwenden? Das ist doch alles so schön linear und überhaupt wenig komplex...
Die erste Version sieht jedenfalls mal nicht übel aus, verfolg' mal im Debugger was es matcht und wo es aufhört zu matchen und warum. Hast du auch sicher \n als Zeilenumbruch und nicht \r\n?
MfG SiDEWinder
-
Was soll ich ansonsten benutzen? Manuell parsen? Ich weiß nicht...
Ja, der Zeilenumbruch ist sicher \n und nicht \r\n.
Ich komm nicht mehr weiter. Wie man Regex im Debugger verfolgt, weiß ich nicht.
Ich hasse Regex
-
Das ist doch eine normale CSV Datei mit \t als Trennzeichnen. Keine Regex nehmen sondern selber parsen. Ist viel einfacher und schneller.
Regex sind für dynamische Suchen. Wenn du immer genau das selbe suchst, ist regex idR nicht das richtige Werkzeug. Eigentlich sind regex fast immer nicht das richtige Werkzeug.
Python hat sogar ein eigenes Modul für csv Parsing: http://docs.python.org/library/csv.html