Python re.sub con un flag non sostituisce tutte le occorrenze
-
09-06-2019 - |
Domanda
I documenti Python dicono:
re.MULTILINE:Quando specificato, il carattere del modello '^' corrisponde all'inizio della stringa e all'inizio di ogni riga (immediatamente dopo ogni fine riga)...Per impostazione predefinita, '^' corrisponde solo all'inizio della stringa...
Allora cosa succede quando ottengo il seguente risultato inaspettato?
>>> 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.'
Soluzione
Guarda la definizione di re.sub
:
sub(pattern, repl, string[, count])
Il quarto argomento è il conteggio che stai utilizzando re.MULTILINE
(che è 8) come conteggio, non come bandiera.
Devi compilare la tua regex se desideri utilizzare i flag.
re.sub(re.compile('^//', re.MULTILINE), '', s)
UN flags
l'argomento è stato aggiunto in Python 2.7, quindi la definizione completa ora è:
re.sub(pattern, repl, string[, count, flags])
Che significa che:
re.sub('^//', '', s, flags=re.MULTILINE)
lavori.
Altri suggerimenti
re.sub('(?m)^//', '', s)
La definizione completa di re.sub
È:
re.sub(pattern, repl, string[, count, flags])
Ciò significa che se dici a Python quali sono i parametri, puoi passare flags
senza passare count
:
re.sub('^//', '', s, flags=re.MULTILINE)
o, più concisamente:
re.sub('^//', '', s, flags=re.M)