Python re.sub mit einem Flag ersetzt nicht alle Vorkommen
-
09-06-2019 - |
Frage
In den Python-Dokumenten heißt es:
re.MULTILINE:Wenn es angegeben wird, entspricht das Musterzeichen „^“ dem Anfang der Zeichenfolge und dem Anfang jeder Zeile (unmittelbar nach jedem Zeilenumbruch) ...Standardmäßig stimmt „^“ nur mit dem Anfang der Zeichenfolge überein ...
Was passiert also, wenn ich das folgende unerwartete Ergebnis erhalte?
>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
Lösung
Schauen Sie sich die Definition von an re.sub
:
sub(pattern, repl, string[, count])
Das vierte Argument ist die Anzahl, die Sie verwenden re.MULTILINE
(was 8 ist) als Anzahl, nicht als Flag.
Sie müssen Ihre Regex kompilieren, wenn Sie Flags verwenden möchten.
re.sub(re.compile('^//', re.MULTILINE), '', s)
A flags
Das Argument wurde in Python 2.7 hinzugefügt, daher lautet die vollständige Definition jetzt:
re.sub(pattern, repl, string[, count, flags])
Was bedeutet, dass:
re.sub('^//', '', s, flags=re.MULTILINE)
funktioniert.
Andere Tipps
re.sub('(?m)^//', '', s)
Die vollständige Definition von re.sub
Ist:
re.sub(pattern, repl, string[, count, flags])
Das heißt, wenn Sie Python die Parameter mitteilen, können Sie übergeben flags
ohne zu passieren count
:
re.sub('^//', '', s, flags=re.MULTILINE)
oder prägnanter:
re.sub('^//', '', s, flags=re.M)