Группировка ( ) и захватывающие группы
Учимся объединять часть паттерна в группу и вытаскивать её отдельно от всего совпадения.
Группа — часть паттерна в круглых скобках; она позволяет применить квантор ко всей последовательности и запомнить совпавший кусок.
Две задачи скобок
Круглые скобки ( ) делают сразу две вещи: группируют часть паттерна (чтобы квантор действовал на всю последовательность) и захватывают совпавший текст для отдельного доступа.
Сначала про группировку. Мы помним, что квантор действует на один элемент. Чтобы повторить целую последовательность, её оборачивают в скобки:
import re
print(re.findall(r"(ab)+", "ababab xx ab"))
Вывод:
['ab', 'ab']
Группа (ab)+ требует одно или более повторений «ab». (Почему findall вернул именно 'ab', а не 'ababab' — особенность findall с группами, разберём в разделе про поиск.)
Захват: вытаскиваем части
Главная польза скобок — они запоминают совпавшую часть, и к ней можно обратиться отдельно. Разберём дату на год, месяц и день:
import re
m = re.search(r"(\d{4})-(\d{2})-(\d{2})", "Дата: 2024-06-14 готова")
print(m.group(0)) # всё совпадение
print(m.group(1)) # первая группа
print(m.group(2)) # вторая группа
print(m.group(3)) # третья группа
Вывод:
2024-06-14 2024 06 14
Группы нумеруются по открывающей скобке слева направо, начиная с 1. group(0) (или просто group()) — это всё совпадение целиком.
Метод groups()
Чтобы получить сразу все захваченные группы кортежем, есть groups():
import re
m = re.search(r"(\d{4})-(\d{2})-(\d{2})", "2024-06-14")
print(m.groups())
year, month, day = m.groups()
print(f"{day}.{month}.{year}")
Вывод:
('2024', '06', '14')
14.06.2024
Удобно: один поиск — и сразу распаковали части в переменные. Так регулярки превращают «сырой» текст в структурированные данные.
Группы и кванторы вместе
Скобки и кванторы отлично работают в паре. Например, IP-адрес — это группа «цифры-точка», повторённая, и финальные цифры. А пока запомните: всё, что нужно повторить или вытащить отдельно, заключайте в скобки.
Итог
- Круглые скобки группируют (для квантора) и захватывают (для доступа).
- Группы нумеруются с 1 по открывающей скобке;
group(0)— всё совпадение. m.group(n)— n-я группа,m.groups()— все группы кортежем.