Frage
Sie versuchen, einen regulären Ausdruck zu verwenden, um einen großen Textblock abzugleichen, und Sie benötigen Übereinstimmung über mehrere Zeilen hinweg.
Lösung
Dieses Problem tritt normalerweise auf, wenn Sie einen Punkt (.) verwenden, um ein beliebiges Zeichen zu finden, aber vergessen Sie, dass der Punkt (.) nicht mit Fakten übereinstimmen kann, die einem Zeilenumbruch entsprechen . Angenommen, Sie möchten versuchen, den C-Split-Kommentar abzugleichen:
>>> comment = re.compile(r'/\*(.*?)\*/')<br/>>>> text1 = '/* this is a comment */'<br/>>>> text2 = '''/* this is a<br/>... multiline comment */<br/>... '''<br/>>>><br/>>>> comment.findall(text1)<br/>[' this is a comment ']<br/>>>> comment.findall(text2)<br/>[]<br/>>>><br/>
Um dieses Problem zu beheben, können Sie die Musterzeichenfolge ändern, um Unterstützung für Zeilenumbrüche hinzuzufügen. Beispiel:
>>> comment = re.compile(r'/\*((?:.|\n)*?)\*/')<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>>>><br/>
In diesem Muster gibt (?:.|n) eine nicht erfassende Gruppe an (d. h. es definiert eine Gruppe, die nur für den Abgleich verwendet wird und nicht einzeln erfasst oder nummeriert werden kann).
Diskussion
re.compile()
Die Funktion akzeptiert einen Flag-Parameter namens re.DOTALL
, der hier sehr nützlich ist. Es ermöglicht . in regulären Ausdrücken, jedes Zeichen einschließlich Zeilenumbrüchen zuzuordnen. Zum Beispiel:
>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>
Die Verwendung von re.DOTALL
zum Markieren von Parametern funktioniert in einfachen Fällen gut, aber wenn das Muster sehr komplex ist oder mehrere Muster kombiniert werden, um ein Zeichenfolgentoken zu erstellen (ausführlich in Abschnitt 2.18 beschrieben), sind einige Bei der Verwendung dieses Markierungsparameters können Probleme auftreten. Wenn Sie die Wahl haben, ist es besser, Ihr eigenes Muster für reguläre Ausdrücke zu definieren, damit es gut funktioniert, ohne dass zusätzliche Markierungsparameter erforderlich sind.
Empfohlenes Tutorial: „Python-Tutorial“
Das obige ist der detaillierte Inhalt vonGrundlegendes zu mehrzeiligen Übereinstimmungsmustern in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!