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

312

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

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

kjakeb
источник
Рекурсивные 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будет возвращен список совпадающих кортежей, а не список совпадающих строк.
Родоргас