findall и finditer: все совпадения

Перебираем все совпадения в строке, а не только первое.

findall возвращает список совпавших строк, а finditer — поток объектов Match с полной информацией о каждом.

findall — список совпадений

re.search находит только первое совпадение. Чтобы получить все, есть re.findall — он возвращает список строк:

import re

print(re.findall(r"\d+", "a1 b22 c333"))

Вывод:

['1', '22', '333']

Ловушка findall с группами

Важная особенность: если в паттерне есть захватывающие группы, findall возвращает не всё совпадение, а содержимое групп. С одной группой — список её значений, с несколькими — список кортежей:

import re

print(re.findall(r"(\w+)=(\d+)", "x=1 y=22 z=333"))

Вывод:

[('x', '1'), ('y', '22'), ('z', '333')]

Каждое совпадение превратилось в кортеж (имя, значение) — то, что захватили группы. Это удобно для разбора пар «ключ — значение». Если же группы нужны для логики, а в результате они мешают, используйте незахватывающие (?:...).

finditer — совпадения с позициями

Когда нужны не только тексты, но и позиции или другие данные, берут re.finditer. Он возвращает итератор объектов Match:

import re

for m in re.finditer(r"\d+", "a1 b22 c333"):
    print(m.group(), "на позициях", m.start(), m.end())

Вывод:

1 на позициях 1 2
22 на позициях 4 6
333 на позициях 8 11

С каждым Match доступны group(), groups(), span(), именованные группы — вся информация о совпадении.

Что выбрать

ФункцияВозвращаетКогда
searchпервый Matchнужно одно совпадение
findallсписок строк/кортежейнужны только тексты совпадений
finditerитератор Matchнужны позиции, группы, подробности

finditer ещё и экономнее по памяти на больших текстах: он не строит сразу весь список, а выдаёт совпадения по одному.

Итог

  • findall возвращает список совпавших строк (или кортежей групп, если группы есть).
  • Группы меняют формат вывода findall — помните об этом.
  • finditer даёт объекты Match с позициями и группами; экономит память.
Проверьте себя
1. Что возвращает re.findall, если в паттерне НЕТ групп?
AСписок объектов Match
BСписок строк — все найденные совпадения
CТолько первое совпадение
DСловарь
2. Как изменится результат findall, если в паттерне есть две захватывающие группы?
AВернётся список строк целых совпадений
BВернётся список кортежей с содержимым групп
CВернётся ошибка
DВернётся только первая группа
3. Когда лучше использовать finditer вместо findall?
AКогда нужны только тексты совпадений
BКогда нужны позиции (start/end) или полные объекты Match, а также для экономии памяти на больших текстах
CКогда нужно одно совпадение
Dfinditer всегда хуже findall
Поддержать проект