Python re.sub avec un indicateur ne remplace pas toutes les occurrences
-
09-06-2019 - |
Question
La documentation Python dit :
re.MULTILINE :Lorsqu'il est spécifié, le caractère de modèle '^' correspond au début de la chaîne et au début de chaque ligne (immédiatement après chaque nouvelle ligne)...Par défaut, '^' ne correspond qu'au début de la chaîne...
Alors, que se passe-t-il lorsque j'obtiens le résultat inattendu suivant ?
>>> 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.'
La solution
Regardez la définition de re.sub
:
sub(pattern, repl, string[, count])
Le 4ème argument est le nombre que vous utilisez re.MULTILINE
(qui vaut 8) comme décompte, pas comme drapeau.
Vous devez compiler votre regex si vous souhaitez utiliser des indicateurs.
re.sub(re.compile('^//', re.MULTILINE), '', s)
UN flags
L'argument a été ajouté dans Python 2.7, donc la définition complète est maintenant :
re.sub(pattern, repl, string[, count, flags])
Ce qui signifie que:
re.sub('^//', '', s, flags=re.MULTILINE)
travaux.
Autres conseils
re.sub('(?m)^//', '', s)
La définition complète de re.sub
est:
re.sub(pattern, repl, string[, count, flags])
Ce qui signifie que si vous indiquez à Python quels sont les paramètres, vous pouvez alors transmettre flags
sans passer count
:
re.sub('^//', '', s, flags=re.MULTILINE)
ou, de manière plus concise :
re.sub('^//', '', s, flags=re.M)