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?


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']

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.