Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verhält sich re.sub mit dem re.MULTILINE-Flag unerwartet?

Warum verhält sich re.sub mit dem re.MULTILINE-Flag unerwartet?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 14:51:02428Durchsuche

Why is re.sub Behaving Unexpectedly with the re.MULTILINE Flag?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn