Именованная группа регулярных выражений" (?P 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?! -- но, в свою защиту, я смутно припоминаю!--3-->этой теме [выделено мной]:

Тема: Утверждая (?П...) расширения синтаксиса regex

From: Guido van Rossum (gui...@CNRI.Reston.Va.US)

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

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

вы, вероятно, знаете о 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 к синтаксису регулярных выражений Perl. Если у вас есть планы использовать (?П, пожалуйста, дайте нам знать как можно скорее, чтобы мы могли решить конфликт. в противном случае, было бы неплохо, если бы (?Синтаксис может быть постоянно зарезервировано для расширений синтаксиса, специфичных для Python. (Is есть какой-то реестр расширений?)

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

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

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


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