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

Именованные группы регулярных выражениях

Python поддерживает несколько расширений языка Perl. Если первый символ после знака вопроса '?' это P, помните что это расширение, специфичное для Python. Одно из таких расширений - это именованные группы. Вместо ссылки на группы по номерам на них можно ссылаться по имени.

Синтаксис именованных групп является одним из расширений Python: (?P<name>...). Переменная name это название группы. Именованные группы ведут себя точно так же, как группы c захватом и дополнительно связывают имя с группой. Все методы объекта Match, которые имеют дело с группами захвата, принимают либо целые числа, которые ссылаются на группу по номеру, либо строки, которые содержат имя нужной группы. Именованным группам по-прежнему присваиваются номера, поэтому можно получить информацию о группе двумя способами:

>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
# 'Lots'
>>> m.group(1)
# 'Lots'

Именованные группы удобны тем, что позволяют вам легко запоминать имена, вместо того, чтобы запоминать цифры. Вот пример RE из модуля imaplib:

InternalDate = re.compile(r'INTERNALDATE "'
        r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-'
        r'(?P<year>[0-9][0-9][0-9][0-9])'
        r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
        r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
        r'"')

Гораздо проще написать m.group('zonem'), чем вспоминать или высчитывать номер группы.

Синтаксис обратных ссылок в выражении, например (...)\1 относится к номеру группы. Естественно, есть вариант, в котором вместо номера группы используется ее имя. Это еще одно расширение Python: (?P=name) указывает, что содержимое группы с именем name должно снова совпадать в текущей месте. Регулярное выражение (\b\w+)\s+\1 для поиска двойных слов можно переписать следующим образом:

>>> p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')
>>> p.search('Paris in the the spring').group()
# 'the the'