¿Cómo puedo encontrar todas las coincidencias con una expresión regular en Python?

312

En un programa que estoy escribiendo, Python usa la re.search()función para encontrar coincidencias en un bloque de texto e imprimir los resultados. Sin embargo, el programa se cierra una vez que encuentra la primera coincidencia en el bloque de texto.

¿Cómo hago esto repetidamente cuando el programa no se detiene hasta que se hayan encontrado TODAS las coincidencias? ¿Hay una función separada para hacer esto?

kjakeb
fuente
Los REs recursivos son una bestia diferente. Quieres repetir la búsqueda.
outis

Respuestas:

546

Uso re.findallo en su re.finditerlugar.

re.findall(pattern, string) devuelve una lista de cadenas coincidentes.

re.finditer(pattern, string)devuelve un iterador sobre MatchObjectobjetos.

Ejemplo:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']
Ámbar
fuente
18
finditerera lo que estaba buscando Me sorprende que uno devuelva objetos Match y las otras cadenas. Esperaba usar una match_allo match_iterfunción.
dsclose
21
Exención de responsabilidad: los que se encuentra sólo que no se solapan partidos
Antoine Lizee
3
@ AntoineLizée, ¿cómo se encuentran las iteraciones CON superposición?
Raksha
16
@Raksha: uso re.searchen bucle. Devolverá un Matchobjeto. Querrá pasar Match.start() + 1como posargumento re.searchpara la próxima iteración del bucle.
ArtOfWarfare
3
Si la coincidencia contiene más de un grupo, findalldevolverá una lista de tuplas coincidentes, no una lista de cadenas coincidentes.
rodorgas