2008-09-03 13 views
39

SAY docs Python:Python re.sub avec un drapeau ne remplace pas toutes les occurrences

re.MULTILINE: Quand 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, '^' correspond uniquement 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.' 

Répondre

93

Regardez la définition de re.sub:

sub(pattern, repl, string[, count]) 

Le 4ème argument est le nombre, vous utilisez re.MULTILINE (qui est 8) le nombre, non pas comme un drapeau.

Vous devez compiler votre regex si vous souhaitez utiliser des drapeaux.

re.sub(re.compile('^//', re.MULTILINE), '', s) 

Un argument flags a été ajouté en 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) 

œuvres.

+6

il serait préférable d'avoir 're.compile ('^ //', re.M) .sub ('', s)' – SilentGhost

+0

vous ne devez pas le compiler si vous dites à python le drapeau que vous êtes le passant – pseudosudo

+5

@pseudosudo les arguments flags ont été ajoutés dans Python 2.7, qui n'existait pas lorsque cette réponse a été postée. J'ai ajouté l'information à la réponse. – agf

8
re.sub('(?m)^//', '', s) 
5

La définition complète de re.sub est:

re.sub(pattern, repl, string[, count, flags]) 

Ce qui signifie que si vous dites Python quels sont les paramètres, vous pouvez passer flags sans passer count:

re.sub('^//', '', s, flags=re.MULTILINE) 

ou , plus concise:

re.sub('^//', '', s, flags=re.M) 
+0

Voir mon commentaire et modifier pour l'autre réponse. – agf

+1

@agf Ah, je n'ai pas pensé à regarder la date. – pseudosudo