Сообщить об ошибке.

Группы с захватом в регулярных выражениях. Извлечение результатов.

Часто нужно получить больше информации, чем просто соответствие шаблону регулярного выражения. Выражения RegExp часто используются для анализа строк путем написания шаблона, разделенного на несколько подгрупп, которые соответствуют различным интересующим компонентам. Например, строка заголовка электронной почты делится на имя заголовка и значение, разделенные символом ':'.

Например:

From: author@example.com
User-Agent: Thunderbird 1.5.0.9 (X11/20061227)
MIME-Version: 1.0
To: editor@example.com

Это можно сделать, написав регулярное выражение, которое соответствует всей строке заголовка, и имеет одну группу, которая соответствует имени заголовка, и другую группу, которая соответствует значению заголовка.

Группировка результатов в шаблоне регулярного выражения происходит при помощи круглых скобок '()'. Метасимволы '(' и ')' имеют то же значение, что и в математических выражениях. Они группируют содержащиеся в них выражения для последующего извлечения. Содержимое группы можно повторять при помощи повторяющего квалификатора, например '*', '+', '?', или {m,n}. Например (ab)* будет соответствовать ноль или более повторений ab.

>>> p = re.compile('(ab)*')
>>> print(p.match('ababababab').span())
# (0, 10)

Группы в круглых скобках '()' также фиксируют начальный и конечный индексы текста, которому они соответствуют. Эти индексы могут быть получены путем вызова соответствующего метода объекта Match - Match.start(), Match.end() или Match.span(). Группы в шаблоне нумеруются начиная с 0. Группа 0 присутствует всегда, это совпадение с целым шаблоном RegExp, поэтому все методы объекта Match имеют группу 0 в качестве аргумента по умолчанию.

>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
# 'ab'
>>> m.group(0)
# 'ab'

Подгруппы нумеруются слева направо, от 1 вверх. Группы могут быть вложенными. Чтобы определить номер группы, просто посчитайте начальные скобки, идущие слева направо.

>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
# 'abcd'
>>> m.group(1)
# 'abc'
>>> m.group(2)
# 'b'

В метод group()` может быть передано несколько номеров групп за раз, и в этом случае он вернет кортеж, содержащий соответствующие значения для этих групп.

>>> m.group(2,1,2)
# ('b', 'abc', 'b')

Метод groups() возвращает кортеж, содержащий строки для всех подгрупп, от 1 до "сколько там есть".

>>> m.groups()
# ('abc', 'b')