Jak mogę znaleźć wszystkie dopasowania do wyrażenia regularnego w Pythonie?

312

W programie, który piszę, Python używa tej re.search()funkcji do wyszukiwania dopasowań w bloku tekstu i drukowania wyników. Jednak program kończy pracę, gdy znajdzie pierwsze dopasowanie w bloku tekstu.

Jak to zrobić wielokrotnie, gdy program nie zatrzymuje się, dopóki nie zostaną znalezione WSZYSTKIE dopasowania? Czy jest do tego osobna funkcja?

kjakeb
źródło
Rekurencyjne RE to inna bestia. Chcesz powtórzyć wyszukiwanie.
poza 15.01.11

Odpowiedzi:

545

Użyj re.findalllub re.finditerzamiast.

re.findall(pattern, string) zwraca listę pasujących ciągów.

re.finditer(pattern, string)zwraca iterator nad MatchObjectobiektami.

Przykład:

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']
Bursztyn
źródło
18
finditertego szukałem. Dziwi mnie, że jeden zwraca obiekty dopasowania, a pozostałe ciągi znaków. Spodziewałem się użyć funkcji match_alllub match_iter.
dsclose
21
OŚWIADCZENIE: te znajdą tylko mecze, które się nie pokrywają
Antoine Lizée 10.09.16
3
@ AntoineLizée, jak znaleźć iteracje z nakładaniem się?
Raksha
16
@Raksha - Użyj re.searchw pętli. Zwróci Matchobiekt. Będziesz chciał przekazać Match.start() + 1jako posargument za re.searchnastępną iteracją pętli.
ArtOfWarfare
3
Jeśli dopasowanie zawiera więcej niż jedną grupę, findallzwróci listę pasujących krotek, a nie listę pasujących ciągów.
rodorgas