Python re.sub con una bandera no reemplaza todas las ocurrencias

Los documentos de Python dicen:

re.MULTILINE: cuando se especifica, el carácter de patrón ‘^’ coincide al principio de la cadena y al principio de cada línea (inmediatamente después de cada nueva línea) … De forma predeterminada, ‘^’ solo coincide al principio de la cadena …

Entonces, ¿qué sucede 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.' 

Mira la definición de re.sub :

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

El cuarto argumento es el conteo, usted está usando re.MULTILINE (que es 8) como el conteo, no como una bandera.

Tienes que comstackr tu expresión regular si quieres usar banderas.

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

Se agregó un argumento de flags 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) 

trabajos.

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

La definición completa de re.sub es:

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

Lo que significa que si le dices a Python cuáles son los parámetros, entonces puedes pasar las flags sin pasar la count :

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

o, más concisamente:

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