¿Cuál es la diferencia entre re.search y re.match?

Resuelto Daryl Spitzer asked hace 16 años • 10 respuestas

¿ Cuál es la diferencia entre las funciones search()y match()en el remódulo Python?

He leído la documentación de Python 2 ( documentación de Python 3 ), pero parece que nunca la recuerdo.

Daryl Spitzer avatar Oct 08 '08 07:10 Daryl Spitzer
Aceptado

re.matchestá 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 MatchObjectinstancia correspondiente. Devuelve Nonesi 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.searchbusca 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 MatchObjectinstancia correspondiente. Devuelve Nonesi 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 matchvs.search que también cubre cadenas multilínea:

Python ofrece dos operaciones primitivas diferentes basadas en expresiones regulares: matchbusca una coincidencia solo al principio de la cadena, mientras que searchbusca una coincidencia en cualquier parte de la cadena (esto es lo que hace Perl de forma predeterminada).

Tenga en cuenta que matchpuede diferir search incluso cuando se usa una expresión regular que comienza con '^': '^'coincide solo al inicio de la cadena, o en el MULTILINEmodo también inmediatamente después de una nueva línea. La matchoperació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 el pos 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
nosklo avatar Oct 08 '2008 00:10 nosklo

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.

Dhanasekaran Anbalagan avatar Dec 31 '2011 12:12 Dhanasekaran Anbalagan