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


Anmelden zum Antworten