Python re.sub con una bandera no reemplazar todas las apariciones
-
09-06-2019 - |
Pregunta
El Python docs decir:
re.MULTILINE:Cuando se especifica, el patrón de carácter '^' coincide con el comienzo de la cadena y en el principio de cada línea (inmediatamente después de cada salto de línea)...De forma predeterminada, '^' coincide sólo en el principio de la cadena...
Entonces, ¿qué está pasando cuando me sale el siguiente resultado inesperado?
>>> 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.'
Solución
Mira la definición de re.sub
:
sub(pattern, repl, string[, count])
El 4 de argumento es el número, usted está utilizando re.MULTILINE
(8) como el conde, no como una bandera.
Usted tiene que compilar el regex si desea utilizar banderas.
re.sub(re.compile('^//', re.MULTILINE), '', s)
Un flags
argumento fue añadida en Python 2.7, por lo que la definición completa es ahora:
re.sub(pattern, repl, string[, count, flags])
Lo que significa que:
re.sub('^//', '', s, flags=re.MULTILINE)
obras.
Otros consejos
re.sub('(?m)^//', '', s)
La definición completa de re.sub
es:
re.sub(pattern, repl, string[, count, flags])
Lo que significa que si usted le dice a Python lo que los parámetros son, entonces usted puede pasar flags
sin pasar count
:
re.sub('^//', '', s, flags=re.MULTILINE)
o, de forma más concisa:
re.sub('^//', '', s, flags=re.M)