re.match
está anclado al principio de la cadena. Eso no tiene nada que ver con líneas nuevas, por lo que no es lo mismo que usar ^
en el patrón.
A medida que el re.match documentation dice:
Si cero o más caracteres al comienzo de cadena coinciden con el patrón de expresión regular, regresar una instancia MatchObject
correspondiente. Devuelve None
si la cadena no coincide con ; tenga en cuenta que esto es diferente de una coincidencia de longitud cero.
Nota: Si desea encontrar una coincidencia en cualquier lugar de la cadena, utilice search()
en su lugar.
re.search
búsquedas toda la cadena, como the documentation says:
escanear a través de la cadena en busca de un lugar donde la expresión patrón regular produce una coincidencia, y devolver una correspondiente MatchObject
ejemplo. 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 .
Por lo tanto, si necesita hacer coincidir al principio de la cadena o para hacer coincidir toda la cadena, utilice match
. Es mas rapido. De lo contrario, use search
.
La documentación tiene un specific section for match
vs. search
que también cubre líneas múltiples:
Python ofrece dos diferentes primitivas operaciones basadas en regulares expresiones: match
comprueba si hay un partido sólo al principio de la cadena, mientras search
busca una coincidencia en cualquier parte en la cadena (esto es lo que Perl hace de forma predeterminada).
Tenga en cuenta que match
pueden diferir de search
incluso cuando se utiliza una expresión regular comenzando con '^'
: '^'
partidos única al comienzo de la cadena, o en MULTILINE
modo también inmediatamente después de una nueva línea. El “match
” operación tiene éxito sólo si el patrón partidos al inicio de la cadena independientemente del modo, o en el posición inicial propuesta por el argumento opcional pos
independientemente de si una nueva línea precede.
Ahora, suficiente conversación. 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
¿Qué pasa con las cadenas que contienen líneas nuevas? –
incluso con cadenas que contengan líneas nuevas, coincide con match() solo al COMIENZO de la cadena. – nosklo
¡Esa es la respuesta que esperaba! (Especialmente ahora que proporcionó un ejemplo.) –