2008-10-08 7 views
304

¿Cuál es la diferencia entre las funciones search() y match() en el Python re module?¿Cuál es la diferencia entre re.search y re.match?

He leído el documentation (current documentation), pero parece que nunca lo recuerdo. Sigo teniendo que buscarlo y volver a aprenderlo. Espero que alguien responda claramente con ejemplos para que (tal vez) se quede en mi cabeza. O al menos tendré un mejor lugar para regresar con mi pregunta y tomará menos tiempo volver a aprenderlo.

Respuesta

313

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 
+0

¿Qué pasa con las cadenas que contienen líneas nuevas? –

+0

incluso con cadenas que contengan líneas nuevas, coincide con match() solo al COMIENZO de la cadena. – nosklo

+0

¡Esa es la respuesta que esperaba! (Especialmente ahora que proporcionó un ejemplo.) –

12

re.match intenta hacer coincidir un patrón al principio de la cadena. re.search intenta hacer coincidir el patrón a lo largo de la cadena hasta que encuentre una coincidencia.

46

re.searchbúsqueda es para el patrón lo largo de la cadena, mientras quere.match no no a la búsqueda el patrón; si no lo hace, no tiene otra opción que coincidir con al comienzo de la cadena.

+3

¿Por qué combinar al inicio, pero no hasta el final de la cadena ('fullmatch' en phyton 3.4)? –

53

search ⇒ encontrar algo en cualquier lugar de la cadena y devolver un objeto coincidente.

match ⇒ encontrar algo en el a partir de la cadena y devolver un objeto partido.

17

se puede hacer referencia al siguiente ejemplo para entender el funcionamiento de re.match y re.search

a = "123abc" 
t = re.match("[a-z]+",a) 
t = re.search("[a-z]+",a) 

re.match devolverá ninguno, pero re.search volverá abc.

+1

Quisiera agregar que la búsqueda devolverá el objeto _sre.SRE_Match (o None si no se encuentra). Para obtener 'abc', debe llamar a t.group() – SanD

18

La diferencia es, re.match() engaña a nadie acostumbrados a Perl, grep, sed o expresiones regulares, y re.search() no lo hace. :-)

Más sobrio, As John D. Cook remarks, re.match() "se comporta como si cada patrón tuviera^antecedido." En otras palabras, re.match('pattern') es igual a re.search('^pattern'). Por lo tanto, ancla el lado izquierdo de un patrón. Pero también no ancla el lado derecho de un patrón: que aún requiere una terminación $.

Francamente, dado lo anterior, creo que re.match() debe estar en desuso. Me interesaría saber los motivos por los que debería conservarse.

+1

"se comporta como si todos los patrones hubieran^antepuesto." solo es cierto si no usa la opción de líneas múltiples. La declaración correcta es "... has \ A prepended" – JoelFan

Cuestiones relacionadas