¿Cuál es la diferencia entre re.search y re.match?
¿ Cuál es la diferencia entre las funciones search()
y match()
en el re
módulo Python?
He leído la documentación de Python 2 ( documentación de Python 3 ), pero parece que nunca la recuerdo.
re.match
está anclado al principio de la cuerda. Eso no tiene nada que ver con las nuevas líneas, por lo que no es lo mismo que usarlo ^
en el patrón.
Como dice la documentación de 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. DevuelveNone
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 localizar una coincidencia en cualquier parte de la cadena, utilice
search()
en su lugar.
re.search
busca en toda la cadena, como dice la documentación :
Escanee la cadena buscando una ubicación donde el patrón de expresión regular produzca una coincidencia y devuelva una
MatchObject
instancia correspondiente. DevuelveNone
si ninguna posición en la cadena coincide con el patrón; tenga en cuenta que esto es diferente a encontrar una coincidencia de longitud cero en algún punto de la cadena.
Entonces, si necesita hacer coincidir el comienzo de la cadena, o hacer coincidir toda la cadena, use match
. Es mas rapido. De lo contrario utilice 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 principio de la cadena, mientras quesearch
busca una coincidencia en cualquier parte de la cadena (esto es lo que hace Perl de forma predeterminada).Tenga en cuenta que
match
puede diferirsearch
incluso cuando se usa una expresión regular que comienza con'^'
:'^'
coincide solo al inicio de la cadena, o en elMULTILINE
modo también inmediatamente después de una nueva línea. Lamatch
operación " " tiene éxito sólo si el patrón coincide al inicio de la cadena independientemente del modo, o en la posición inicial dada por elpos
argumento opcional independientemente de si una nueva línea la 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
search
⇒ busque algo en cualquier parte de la cadena y devuelva un objeto coincidente.
match
⇒ busque algo al principio de la cadena y devuelva un objeto coincidente.