Groupe d'expressions régulières nommé «(? P <group_name> regexp)»: que signifie «P»?

178

En Python, la (?P<group_name>…) syntaxe permet de faire référence à la chaîne correspondante via son nom:

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

Que signifie «P»? Je n'ai trouvé aucun indice dans la documentation officielle .

J'aimerais avoir des idées sur la façon d'aider mes élèves à se souvenir de cette syntaxe. Il serait utile de savoir ce que "P" signifie (ou pourrait représenter).

Eric O Lebigot
la source
8
Psignifie Placeholder.
kev
1
@kev: ça devrait être une réponse?
ninjagecko
3
Puisque les suppositions sont appropriées, je suppose que Ken Thompson est un sympathisant hippie et que le «P» signifie «Patchouli».
aaronasterling le
2
Cette question a été ajoutée à la FAQ sur les expressions régulières Stack Overflow , sous "Groupes".
aliteralmind
6
Au fait, si vous utilisez match.groups(avec un s), vous obtiendrez silencieusement un tuple de tous les groupes -_- groups('name')=> ('John', '123456')quand ce que vous vouliez réellement était group('name')=> 'John' J'espère que cela fera gagner du temps à quelqu'un quelque part.
szmoore

Réponses:

262

Puisque nous devinons tous, je ferais aussi bien de donner le mien: j'ai toujours pensé que cela représentait Python. Cela peut sembler assez stupide - quoi, P pour Python?! - mais pour ma défense, je me suis vaguement souvenu de ce fil [c'est moi qui souligne]:

Objet: Réclamation d'extensions de syntaxe d'expression régulière (? P ...)

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

Date: 10 décembre 1997 15:36:19

J'ai une demande inhabituelle pour les développeurs Perl (ceux qui développent le langage Perl). J'espère que (perl5-porters) est la bonne liste. Je suis en train de copier le string-sig Python car il est à l'origine de la plupart des travaux dont je parle ici.

Vous connaissez probablement Python. Je suis le créateur de Python; Je prévois de sortir une prochaine version "majeure", Python 1.5, d'ici la fin de cette année. J'espère que Python et Perl pourront coexister dans les années à venir; la pollinisation croisée peut être bonne pour les deux langues. (Je pense que Larry a bien examiné Python lorsqu'il a ajouté des objets à Perl 5; O'Reilly publie des livres sur les deux langues.)

Comme vous le savez peut-être, Python 1.5 ajoute un nouveau module d'expression régulière qui correspond plus étroitement à la syntaxe de Perl. Nous avons essayé d'être aussi proche que possible de la syntaxe Perl dans la syntaxe de Python. Cependant, la syntaxe regex a des extensions spécifiques à Python, qui commencent toutes par (? P. Actuellement, il y en a deux:

(?P<foo>...) Similaire aux parenthèses de regroupement normales, mais le texte
correspondant au groupe est accessible après que la correspondance a été effectuée, via le nom de groupe symbolique "foo".

(?P=foo)Correspond à la même chaîne que celle correspondant au groupe nommé "foo". Équivaut à \ 1, \ 2, etc. sauf que le groupe est désigné
par son nom et non par son numéro.

J'espère que cette extension spécifique à Python ne sera pas en conflit avec les futures extensions Perl de la syntaxe des expressions régulières Perl. Si vous prévoyez d'utiliser (? P, veuillez nous en informer dès que possible afin que nous puissions résoudre le conflit. Sinon, ce serait bien si la syntaxe (? P pourrait être réservée en permanence aux extensions de syntaxe spécifiques à Python. (Is existe-t-il une sorte de registre d'extensions?)

à quoi Larry Wall a répondu:

[...] Il n'y a pas de registre pour le moment - la vôtre est la première requête provenant de l'extérieur de perl5-porters, donc c'est une activité à faible bande passante. (Désolé, c'était encore plus bas la semaine dernière - j'étais à New York à Internet World.)

Quoi qu'il en soit, en ce qui me concerne, vous pouvez certainement avoir «P» avec ma bénédiction. (De toute évidence, Perl n'a pas besoin du 'P' à ce stade. :-) [...]

Donc je ne sais pas en quoi le choix initial de P était motivé par - motif? espace réservé? des pingouins? - mais vous pouvez comprendre pourquoi je l'ai toujours associé à Python. Ce qui compte tenu du fait que (1) je n'aime pas les expressions régulières et les évite autant que possible, et (2) ce fil de discussion s'est produit il y a quinze ans, est assez étrange.

DSM
la source
4
"Extension spécifique à Python" peut-être?
jmort253
50
Wow, vous avez trouvé de bonnes et pertinentes données historiques, ici! Mon interprétation du message de Guido est que "P" signifie "extensions spécifiques à Python".
Eric O Lebigot
1
Oui, cela me semble définitif. Il est donc ironique que Perl et PCRE aient initialement copié la syntaxe, simplement parce que Python a été la première version à prendre en charge les captures nommées. Mais ils prennent également en charge la (?<group_name>…)syntaxe, qui semble être la plus populaire - même Java la prend désormais en charge.
Alan Moore
3
+1 C'est l'une des meilleures réponses délicates qui est bien défendue :). Au début, je pensais que c'était trop stupide. Mais à la fin, j'ai totalement accepté.
Sumudu
4
J'adore le fait que même le créateur de Python utilise une syntaxe mystérieuse lorsque Perl est impliqué, et la communauté Perl est tout à fait d'accord avec cela. Si vous essayez d'ajouter des extensions / syntaxe spécifiques à Perl à Python, il y aurait du sang dans les rues.
Keith Ripley
20

Modèle! Le groupe nomme un (sous) modèle pour une utilisation ultérieure dans l'expression régulière. Consultez la documentation ici pour plus de détails sur l'utilisation de ces groupes.

Mike
la source
3
+1: C'est un bon moyen mnémotechnique: (?P<name>…)c'est "pattern name". Tout est un modèle, cependant, dans une expression rationnelle, il est donc assez étrange d'étiqueter uniquement les (?P<…>…)groupes comme des modèles. Cela fera cependant l'affaire pour mes étudiants. :)
Eric O Lebigot
1
@EOL n'enseigne pas de fausses choses aux étudiants. Ils sont plus difficiles à déchirer lorsque vous recherchez l'exactitude que vous ne le pensez. Par exemple. certains, pour moi, prennent plusieurs années 5. Paradoxalement, il est encouragé à parler avec désinvolture, soyez toujours très clair et explicite à ce sujet - par exemple. racontez votre commentaire précédent en entier à vos élèves (en révisant peut-être la toute dernière phrase;).)
n611x007
5

Extension Python. Du Python Docos:

La solution choisie par les développeurs Perl était d'utiliser (? ...) comme syntaxe d'extension. ? immédiatement après une parenthèse était une erreur de syntaxe parce que le? n'aurait rien à répéter, donc cela n'a posé aucun problème de compatibilité. Les personnages immédiatement après le? indique quelle extension est utilisée, donc (? = foo) est une chose (une assertion anticipée positive) et (?: foo) est autre chose (un groupe non capturant contenant la sous-expression foo).

Python prend en charge plusieurs extensions de Perl et ajoute une syntaxe d'extension à la syntaxe d'extension de Perl. Si le premier caractère après le point d'interrogation est un P, vous savez que c'est une extension spécifique à Python

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

Un gars
la source
Bien repéré! Cela confirme le sentiment de DSM.
Eric O Lebigot