68 votes

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

La documentation de Python dit :

re.MULTILINE : Lorsqu'il est spécifié, le caractère de motif '^' 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 de caractères...

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.'

141voto

Moe Points 6698

Regardez la définition de re.sub :

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

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

Soit utiliser un argument nommé :

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

Ou compilez d'abord l'expression rationnelle :

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

7 votes

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

0 votes

Vous n'avez pas besoin de le compiler si vous indiquez à python le flag que vous lui passez

6 votes

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

12voto

Ferran Points 51
re.sub('(?m)^//', '', s)

0 votes

@MJM Vous n'avez pas besoin de la MULTILINE dans les paramètres de la fonction, dans ce cas. Elle possède déjà l'indicateur inline pour le multiligne : (?m)

0 votes

Bien joué @mypetlion - gotya (y)

8voto

pseudosudo Points 872

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, alors vous pouvez passer flags sans passer count :

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

ou, de manière plus concise :

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

2 votes

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X