Heim > Artikel > Backend-Entwicklung > Warum verhält sich re.sub mit dem re.MULTILINE-Flag unerwartet?
Unerwartete Ersetzung mit re.sub und Flag
In der Python-Dokumentation heißt es, dass das re.MULTILINE-Flag das Caret-Zeichen (^) zulässt Übereinstimmung am Anfang jeder Zeile. Wenn dieses Flag jedoch mit re.sub verwendet wird, kann es zu unerwartetem Verhalten kommen.
Betrachten Sie dieses Beispiel:
<code class="python">import re s = """// The quick brown fox. // Jumped over the lazy dog.""" result = re.sub('^//', '', s, re.MULTILINE) print(result)</code>
Das erwartete Ergebnis ist, dass alle Zeilen mit „//“ beginnen durch eine leere Zeichenfolge ersetzt, sodass nur Folgendes übrig bleibt:
The quick brown fox. Jumped over the lazy dog.
Das tatsächliche Ergebnis lautet jedoch:
The quick brown fox. // Jumped over the lazy dog.
Grund für das Problem
Das Problem entsteht, weil die Funktion re.sub ein viertes Argument für die maximale Anzahl der durchzuführenden Ersetzungen akzeptiert. Im Beispiel wurde re.MULTILINE fälschlicherweise als Anzahl statt als Flag verwendet.
Lösung
Um dieses Verhalten zu korrigieren, verwenden Sie ein benanntes Argument, um anzugeben flag:
<code class="python">result = re.sub('^//', '', s, flags=re.MULTILINE)</code>
Alternativ können Sie den regulären Ausdruck mit dem gewünschten Flag kompilieren, bevor Sie ihn mit re.sub verwenden:
<code class="python">regex = re.compile('^//', re.MULTILINE) result = re.sub(regex, '', s)</code>
Durch die korrekte Angabe des re.MULTILINE-Flags können Sie kann sicherstellen, dass alle Vorkommen des Musters ^// ersetzt werden, unabhängig von ihrer Position innerhalb der Zeichenfolge.
Das obige ist der detaillierte Inhalt vonWarum verhält sich re.sub mit dem re.MULTILINE-Flag unerwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!