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

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

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

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

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

2 ответа

Решение

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

Тема: Утверждение (?P...) расширений синтаксиса регулярных выражений

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

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

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

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

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

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

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

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

на что Ларри Уолл ответил:

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

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

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

Расширение Python. Из Python Docos:

Разработчики Perl выбрали решение использовать (?...) в качестве синтаксиса расширения.? сразу после скобки была синтаксическая ошибка, потому что? нечего было бы повторять, поэтому никаких проблем с совместимостью не возникло. Персонажи сразу после? указать, какое расширение используется, так что (?=foo) - это одно (утверждение положительного просмотра вперед), а (?:foo) - это что-то другое (не захватывающая группа, содержащая подвыражение foo).

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

https://docs.python.org/3/howto/regex.html

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

Другие вопросы по тегам