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

178

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

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

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

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

Эрик О Лебиго
источник
8
Pобозначает Placeholder.
Кев
1
@kev: кажется, что это должен быть ответ?
ninjagecko
3
Поскольку догадки уместны, я предполагаю, что Кен Томпсон - сочувствующий хиппи, а «P» означает «Пачули».
Ааронастерлинг
2
Этот вопрос был добавлен в FAQ по регулярным выражениям Stack Overflow в разделе «Группы».
aliteralmind
6
Кстати, если вы используете match.groupss), вы молча получите кортеж всех групп -_- groups('name')=>, ('John', '123456')когда то, что вы на самом деле хотели, было group('name')=> 'John' Я надеюсь, что это спасет кого-то где-то некоторое время.
17

Ответы:

262

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

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

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

Дата: 10 декабря 1997 г., 15: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) этот поток произошел пятнадцать лет назад, довольно странно.

DSM
источник
4
"Python-специфичное расширение" возможно?
jmort253
50
Ух ты, ты нашел здесь несколько хороших и актуальных исторических данных! Моя интерпретация поста Гвидо такова, что «P» означает «специфичные для Python расширения».
Эрик О Лебигот
1
Да, это выглядит окончательно для меня. Поэтому иронично, что Perl и PCRE изначально скопировали синтаксис только потому, что Python был первым вариантом, поддерживающим именованные захваты. Но они также поддерживают (?<group_name>…)синтаксис, который кажется наиболее популярным - даже Java поддерживает его сейчас.
Алан Мур
3
+1 Это один из лучших неловких ответов, который хорошо защищен :). Сначала я подумал, что это слишком глупо. Но в итоге я полностью согласился.
Sumudu
4
Мне нравится, что даже создатель Python использует причудливый загадочный синтаксис, когда задействован Perl, и сообщество Perl вполне в этом разбирается. Если вы попытаетесь добавить специфичные для Perl расширения / синтаксис в Python, на улицах будет кровь.
Кит Рипли
20

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

Майк
источник
3
+1: это хорошее мнемоническое устройство: (?P<name>…)это «шаблон name». Тем не менее, все является шаблоном в регулярном выражении, поэтому довольно странно маркировать (?P<…>…)группы только как шаблоны. Это подойдет для моих учеников. :)
Эрик О Лебигот
1
@EOL не учите студентов лживым вещам. Их сложнее уничтожить, когда вы достигнете точности, чем вы думаете. Например. некоторые, для меня, занимают годы, кратные 5. Как это ни парадоксально, рекомендуется говорить небрежно, просто всегда быть очень ясным и ясным об этом - например. Расскажите своим предыдущим комментариям в полном объеме своим студентам (возможно, пересмотрев самое последнее предложение;).)
n611x007
5

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

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

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

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

Какой-то парень
источник
Хорошо подмечено! Это подтверждает чувства DSM.
Эрик О Лебиго