Ich stoße bei der Verwendung von regulären Ausdrücken gerade an eine Verständnissgrenze:
Ich muss in einer Textdatei nach einer Passage suchen, welche sich ggf. über mehrere Zeilen erstreckt. Ich habe mir dafür auch einen wunderbaren Regex gebaut, der in https://regex101.com/ wunderbar mit den bereitgestellten Testdaten funktioniert, allerdings kriege ich das nicht in meinen Code integriert
Ich habe eine Textdatei, in welcher ich mehrzeilig nach einem Regex-Treffer suchen muss. Das probiere ich, indem ich den Inhalt einer Datei zunächst komplett in eine Variable lese und den regex anschließend darauf anwende. Klappt aber nicht, so wie ich mir das vorstelle.
Ich habe das Problem mal folgendermaßen auf einen leichter verdaulichen Happen heruntergebrochen:
Code: Alles auswählen
import re
with open('testdata.txt') as myfile:
content = myfile.read()
print(content)
print("=================")
print(re.match(r'^Test$', content))
print(re.match(r'^Test$', content, flags=re.MULTILINE))
print(re.match(r'^(?:\n|.*)*Test(?:\n|.*)*$', content))
print(re.match(r'^(?:\n|.*)*Test(?:\n|.*)*$', content, flags=re.MULTILINE))
Code: Alles auswählen
$ python3.6 demo.py
Dieses ist
ein
Test
foobar
=================
None
None
<_sre.SRE_Match object; span=(0, 26), match='Dieses ist\nein\nTest\nfoobar'>
<_sre.SRE_Match object; span=(0, 26), match='Dieses ist\nein\nTest\nfoobar'>
$
- Nach allem, was ich über reguläre Ausdrücke weiß, markiert "^" in dieser Syntax den Zeilenanfang, wenn man im Multiline modus arbeitet; sonst trifft der den Anfang des gesamten Strings, samt seiner möglichen Zeilenumbrüche. Der erste Regex (r'^Test$') sollte demnach auf eine Zeile passen, die genau "Test" enthält; tut es aber nicht. Wird demnach wohl als einzige, lange Zeile mit Zeilenumbruchzeichen darin behandelt. Also gibt es keinen String der mit "Test" anfängt und endet - matched nicht: Kann ich nachvollziehen. Also: Irgendwie multiline matching aktivieren.
- Kurz in die Doku geschaut, was das re.MULTILINE flag tut und so wie ich es verstehe, sollte das Flag das von mir erwartete Verhalten bringen (zu matchen) - tut es aber ebenfalls nicht.
- Erst, wenn ich den Inhalt von "content" als einen einzigen, langen String betrachte und manuell bestimme, das der String neben beliebig vielen beliebigen Zeichen auch beliebig viele Zeilenumbrüche vor und nach "Test" haben darf, matched das; unabhängig davon ob das re.MULTILINE flag gesetzt ist oder nicht.
Zweite Frage: Sollte dieses der Falsche Weg sein Multiline-Matching in einer Datei anzuwenden: Wie sieht denn dann bitte der korrekte aus?
LG