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'