2008-09-03 20 views
39
docs

la pitón dicen:re.sub Python con una bandera no reemplaza todas las ocurrencias

re.MULTILINE: Cuando se especifica, el carácter patrón '^' coincide con el comienzo de la cadena y al principio de cada línea (inmediatamente después de cada nueva línea) ... Por defecto, '^' coincide solo al principio de la cadena ...

¿Qué ocurre cuando obtengo 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.' 

Respuesta

93

Mira la definición de re.sub:

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

El cuarto argumento es el recuento, que está utilizando re.MULTILINE (que es 8) En el recuento, no como una bandera.

Tienes que compilar tu expresión regular si deseas usar banderas.

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

Un argumento flags se añadió en Python 2.7, por lo que la definición completa es ahora:

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

que significa que:

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

obras.

+6

sería mejor tener 're.compile ('^ //', re.M) .sub ('', s)' – SilentGhost

+0

no tienes que compilarlo si le dices a python la bandera que eres pasándolo – pseudosudo

+5

@pseudosudo, los argumentos de indicadores se agregaron en Python 2.7, que no existía cuando se publicó esta respuesta. He agregado la información a la respuesta. – agf

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

La definición completa de re.sub es:

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

Lo que significa que si le dice a Python cuáles son los parámetros, entonces puede pasar flags sin pasar count:

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

o , más concisamente:

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

Ver mi comentario y editar a la otra respuesta. – agf

+1

@agf Ah, no pensé en mirar la fecha. – pseudosudo

Cuestiones relacionadas