Именованная группа регулярных выражений "(? P <имя_группы> regexp)": что означает "P"?

В Python (?P<group_name>…) syntax позволяет ссылаться на строку с соответствием по имени:

>>> import re
>>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456')
>>> match.group('name')
'John'

Что означает "P"? Я не мог найти никакого намека на официальную документацию .

Мне бы хотелось получить представление о том, как помочь моим ученикам запомнить этот синтаксис. Знать, что означает "P" (или может означать), было бы полезно.

Ответ 1

Поскольку мы все догадываемся, я мог бы также дать мне: я всегда думал, что это означает Python. Это может показаться довольно глупым - что, P для Python?! - но в свою защиту я смутно помнил эту тему [акцент мой]:

Subject: Утверждение (? P...) расширений синтаксиса regex

От: Гвидо ван Россум (gui... @CNRI.Reston.Va.US)

Дата: 10 декабря 1997 года 3:36:19 pm

У меня необычный запрос для разработчиков Perl (те, которые разрабатывают язык Perl). Я надеюсь, что это (perl5-porters) - правильный список. я am cc'ing строковый сингл Python, потому что это источник большинства работу, которую я здесь обсуждаю.

Вероятно, вы знаете о Python. Я создатель Python; я планируя выпустить следующую "основную" версию Python 1.5, к концу в этом году. Я надеюсь, что Python и Perl могут сосуществовать в ближайшие годы; перекрестное опыление может быть хорошим для обоих языков. (Я считаю, Ларри хорошо посмотрел на Python, когда добавил объекты к Perl 5; O'Reilly публикует книги об обоих языках.)

Как вы знаете, Python 1.5 добавляет новый модуль регулярных выражений, который более близко соответствует синтаксису Perl. Мы старались быть как можно ближе к Синтаксис Perl, насколько это возможно, в синтаксисе Python. Однако регулярное выражение синтаксис имеет некоторые специфичные для Python расширения, которые начинаются с (? P. В настоящее время существует два из них:

(?P<foo>...) Подобно обычным скобкам группировки, но текст согласованный группой, доступен после того, как матч был выполнен, через имя символической группы "foo".

(?P=foo) Соответствует той же строке, что и группа с именем "Foo". Эквивалентен \1,\2 и т.д., За исключением того, что группа передается по имени, а не по номеру.

Я надеюсь, что это расширение, специфичное для Python, не будет конфликтовать с любым будущих расширений Perl для синтаксиса regex Perl. Если у вас есть планы используйте (? P, пожалуйста, сообщите нам как можно скорее, чтобы мы могли разрешить конфликт. В противном случае было бы неплохо, если синтаксис (? P может быть постоянно зарезервированный для расширений синтаксиса, специфичных для Python. (Is там какой-то реестр расширений?)

на который ответил Ларри Уэлл:

[...] На данный момент реестра нет - ваш - это первый запрос от вне perl5-porters, так что это довольно низкая пропускная способность. (К сожалению, на прошлой неделе он был еще ниже - я был в Нью-Йорке в Интернете World).

В любом случае, насколько я могу судить, у вас может быть "P" с моим благословение. (Очевидно, Perl не нуждается в "P" в этот момент.:-) [...]

Итак, я не знаю, какой изначальный выбор P был мотивирован шаблоном? заполнитель? пингвины? - но вы можете понять, почему я всегда ассоциировал его с Python. Что касается того, что (1) я не люблю регулярные выражения и избегаю их там, где это возможно, и (2) эта нить, произошедшая пятнадцать лет назад, выглядит странно.

Ответ 2

Pattern! Группа называет шаблон (sub) для последующего использования в регулярном выражении. См. документацию здесь для получения подробной информации о том, как используются такие группы.