Названа група регулярних виразів ((? P <назва_групи> 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
Оскільки здогадки доречні, я здогадуюсь, що Кен Томпсон є симпатиком хіпі і "П" виступає за "Пачулі".
aaronasterling

2
Це запитання було додано до поширених запитань щодо регулярного вираження стека в розділі "Групи".
aliteralmind

6
До речі, якщо ви користуєтесь match.groupss), ви мовчки отримаєте кортеж усіх груп -_- groups('name')=> ('John', '123456')коли те, що ви насправді хотіли, було group('name')=> 'John' Я сподіваюся, що це десь заощадить когось.
szmoore

Відповіді:


262

Оскільки ми всі здогадуємось, я міг би також дати своє: я завжди вважав, що це означає Python. Це може здатися досить дурним - що, P для Python ?! - але на захист я смутно згадав цю тему [наголос мій]:

Тема: Затвердження (? P ...) розширень синтаксису регулярних виразів

Від: Guido van Rossum (gui ... @ CNRI.Reston.Va.US)

Дата: 10 грудня 1997 р. 15:36:19

У мене є незвичний запит для розробників Perl (тих, хто розробляє мову Perl). Я сподіваюся, що це (perl5-porters) - це правильний список. Я переглядаю рядок Python-sig, тому що це початок більшості робіт, про які я тут обговорюю.

Вам, напевно, відомо про Python. Я творець Пітона; Я планую випустити наступну "основну" версію, Python 1.5, до кінця цього року. Я сподіваюся, що Пітон і Перл можуть співіснувати в наступні роки; перехресне запилення може бути корисним для обох мов. (Я вважаю, Ларрі добре придивився до Python, коли додав об’єкти до Perl 5; O'Reilly видає книги про обидві мови.)

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

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

(?P=foo)Відповідає тому ж рядку, що і група, названа "foo". Еквівалентно \ 1, \ 2 тощо, за винятком того, що називається група
на ім'я, а не на число.

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

на що Ларрі Уолл відповів:

[...] Наразі немає жодного реєстру - ваш перший запит із зовнішніх perl5-porters, тому це досить низька пропускна здатність. (Вибачте, що минулого тижня вона була ще нижчою - я їхав у Нью-Йорк в Internet World.)

У будь-якому випадку, наскільки я переживаю, ви, безумовно, можете мати "P" з моїм благословенням. (Очевидно, що Perl в цьому пункті не потрібен 'P'. :-) [...]

Тож я не знаю, чим оригінальний вибір P був мотивований - шаблоном? заповнювач? пінгвіни? - але ви можете зрозуміти, чому я завжди асоціював це з Python. Зважаючи на те, що (1) я не люблю регулярні вирази і уникаю їх, коли це можливо, і (2) ця нитка сталася п’ятнадцять років тому, є дивним.


4
Можливо, "Python-специфічне розширення"?
jmort253

50
Ого, ви знайшли тут добрий та релевантний фрагмент історичних даних! Моя інтерпретація поста Гідо полягає в тому, що "P" означає "розширення, характерні для Python".
Ерік О Лебігот

1
Так, для мене це виглядає остаточно. Тож іронічно, що Perl та PCRE спочатку скопіювали синтаксис лише тому, що Python був першим ароматом, який підтримував названі captures. Але вони також підтримують (?<group_name>…)синтаксис, який, здається, є найпопулярнішим - навіть Java підтримує його зараз.
Алан Мур

3
+1 Це одна з найкращих незручних відповідей, яка добре захищена :). Спочатку я вважав це занадто дурним. Але врешті-решт я цілком погодився.
Сумуду

4
Мені подобається, що навіть творець Python використовує химерний таємничий синтаксис, коли Perl задіяний, і спільнота Perl з цим абсолютно добре. Якби ви спробували додати розширення / синтаксис, характерні для Perl, до Python, на вулицях буде кров.
Кіт Ріплі

20

Візерунок! Група називає (під) шаблон для подальшого використання в регулярному вираженні. Детальну інформацію про використання таких груп див. У документації тут .


3
+1: Це хороший мнемонічний пристрій: (?P<name>…)це "візерунок name". Однак все є зразком у регулярному вираженні, тому дивним є лише (?P<…>…)групи міток як візерунки. Це все ж зробить для моїх студентів. :)
Ерік О Лебігот

1
@EOL не вчить учнів фальшивих речей. Їх важче подрібнити, коли ви досягнете точності, ніж ви думаєте. Напр. Деякі, для мене, займають роки, кратні 5. Як не парадоксально, рекомендується говорити випадково, просто завжди будьте дуже чіткими та явними щодо цього - наприклад. розкажіть своїм попереднім коментарям у повній довжині своїм студентам (переглядаючи, можливо, саме останнє речення;).)
n611x007

5

Розширення Python. З Python Docos:

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

Python підтримує декілька розширень Perl та додає синтаксис розширення до синтаксису розширення Perl. Якщо першим символом після знака питання є P, ви знаєте, що це розширення, специфічне для Python

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


Добре помічений! Це підтверджує почуття DSM.
Ерік О Лебігот
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.