re.match
está anclado al comienzo de la cadena. Eso no tiene nada que ver con las nuevas líneas, por lo que no es lo mismo que usar ^
en el patrón.
Como dice la documentación re.match :
Si cero o más caracteres al
comienzo de la cadena coinciden con el patrón de expresión regular, devuelve una MatchObject
instancia correspondiente . Regrese None
si la cadena no coincide con el patrón; tenga en cuenta que esto es diferente de una coincidencia de longitud cero.
Nota: Si desea ubicar una coincidencia en cualquier lugar de la cadena, use search()
en su lugar.
re.search
busca en toda la cadena, como dice la documentación :
Explore a través de una cadena buscando una ubicación donde el patrón de expresión regular produzca una coincidencia y devuelva una MatchObject
instancia correspondiente . Devuelve None
si ninguna posición en la cadena coincide con el patrón; tenga en cuenta que esto es diferente de encontrar una coincidencia de longitud cero en algún punto de la cadena.
Entonces, si necesita hacer coincidir al comienzo de la cadena, o para que coincida con toda la cadena, use match
. Es mas rapido. De lo contrario uso search
.
La documentación tiene una sección específica para match
vs.search
que también cubre cadenas multilínea:
Python ofrece dos operaciones primitivas diferentes basadas en expresiones regulares: match
busca una coincidencia
solo al comienzo de la cadena, mientras que search
busca una coincidencia
en cualquier parte de la cadena (esto es lo que hace Perl por defecto).
Tenga en cuenta que match
puede diferir search
incluso cuando se usa una expresión regular que comienza con '^'
: '^'
coincide solo al comienzo de la cadena, o en el
MULTILINE
modo también inmediatamente después de una nueva línea. La match
operación " " tiene éxito solo si el patrón coincide al comienzo de la cadena,
independientemente del modo, o en la posición inicial dada por el pos
argumento opcional, independientemente de si una nueva línea lo precede.
Ahora, basta de hablar. Es hora de ver un código de ejemplo:
# example code:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother',
string_with_newlines) # won't match
print re.match('^someother', string_with_newlines,
re.MULTILINE) # also won't match
print re.search('someother',
string_with_newlines) # finds something
print re.search('^someother', string_with_newlines,
re.MULTILINE) # also finds something
m = re.compile('thing$', re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,
re.MULTILINE) # also matches