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 с позициями и группами; экономит память.