Como posso encontrar todas as correspondências para uma expressão regular no Python?

312

Em um programa que estou escrevendo, o Python usa a re.search()função para encontrar correspondências em um bloco de texto e imprimir os resultados. No entanto, o programa sai assim que encontra a primeira correspondência no bloco de texto.

Como faço isso repetidamente onde o programa não para até que TODAS as correspondências sejam encontradas? Existe uma função separada para fazer isso?

kjakeb
fonte
REs recursivos são um animal diferente. Você deseja repetir a pesquisa.
sai 15/01/11

Respostas:

545

Use re.findallou em re.finditervez disso.

re.findall(pattern, string) retorna uma lista de cadeias correspondentes.

re.finditer(pattern, string)retorna um iterador sobre MatchObjectobjetos.

Exemplo:

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
fonte
18
finditerera o que eu estava procurando. Estou surpreso que um retorne objetos Match e as outras strings. Eu estava esperando usar uma função match_allou match_iter.
usar o seguinte comando
21
IMPORTANTE: aqueles encontrará apenas não sobrepostos partidas
Antoine Lizée
3
@ AntoineLizée, como encontrar iterações COM sobrepostas?
Raksha
16
@Raksha - Use re.searchem um loop. Isso retornará um Matchobjeto. Você desejará passar Match.start() + 1como posargumento re.searchpara a próxima iteração do loop.
ArtOfWarfare
3
Se a correspondência contiver mais de um grupo, findallretornará uma lista de tuplas correspondentes, não uma lista de seqüências correspondentes.
Rodorgas