Как мне найти все совпадения с регулярным выражением в Python?


312

В программе, которую я пишу, я использую Python re.search() чтобы найти совпадения в блоке текста и распечатать результаты. Однако программа завершает работу, как только находит первое совпадение в блоке текста.

Как мне сделать это несколько раз, когда программа не останавливается, пока ВСЕ совпадения не будут найдены? Есть ли отдельная функция для этого?


Рекурсивные RE - это другой зверь. Вы хотите повторить поиск.
outis

Ответы:


546

Используйте re.findallили re.finditerвместо.

re.findall(pattern, string) возвращает список совпадающих строк.

re.finditer(pattern, string)возвращает итератор над MatchObjectобъектами.

Пример:

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
finditerбыло то, что я искал. Я удивлен, что один возвращает объекты Match, а другой - строки. Я ожидал использовать функцию match_allили match_iter.
dsclose

21
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: те найдут только непересекающиеся матчи
Антуан Лизе

3
@ AntoineLizée, как найти итерации с перекрытием?
Ракша

16
@Raksha - использовать re.searchв цикле. Это вернет Matchобъект. Вы захотите передать в Match.start() + 1качестве posаргумента для re.searchследующей итерации цикла.
ArtOfWarfare

3
Если совпадение содержит более одной группы, findallбудет возвращен список совпадающих кортежей, а не список совпадающих строк.
Родоргас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.