Именованная группа регулярных выражений "(? 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.
Шаблон! Группа называет (под) шаблон для последующего использования в регулярном выражении. Смотрите документацию здесь для получения подробной информации о том, как такие группы используются.