Группировка ( ) и захватывающие группы

Учимся объединять часть паттерна в группу и вытаскивать её отдельно от всего совпадения.

Группа — часть паттерна в круглых скобках; она позволяет применить квантор ко всей последовательности и запомнить совпавший кусок.

Две задачи скобок

Круглые скобки ( ) делают сразу две вещи: группируют часть паттерна (чтобы квантор действовал на всю последовательность) и захватывают совпавший текст для отдельного доступа.

Сначала про группировку. Мы помним, что квантор действует на один элемент. Чтобы повторить целую последовательность, её оборачивают в скобки:

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() — все группы кортежем.
Проверьте себя
1. Что делают круглые скобки в регулярном выражении?
AТолько ускоряют поиск
BГруппируют часть паттерна и захватывают совпавший текст для отдельного доступа
CЭкранируют метасимволы
DДелают поиск регистронезависимым
2. Что вернёт group(0) у объекта Match?
AПервую захваченную группу
BВсё совпадение целиком
CОшибку — нумерация начинается с 1
DПустую строку
3. Как пронумерованы группы в паттерне (\d{4})-(\d{2})-(\d{2})?
AПо длине: самая длинная — первая
BПо открывающей скобке слева направо: год — 1, месяц — 2, день — 3
CСлучайным образом
DСправа налево
Поддержать проект