it-swarm.com.ru

Именованная группа регулярных выражений "(? 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" (или может означать), было бы полезно.

146
Eric O Lebigot

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

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

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

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

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

Вы, наверное, знаете о 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) этот поток произошел пятнадцать лет назад, довольно странно.

211
DSM

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

17
Mike