Nommé expression régulière de groupe "(?P regexp)": que signifie" P"?

en Python, la syntaxe (?P<group_name>…) permet de se référer à la chaîne correspondante par son nom:

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

que signifie "P"? Je n'ai pu trouver aucun indice dans la documentation officielle .

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

116
demandé sur ekad 2012-04-08 05:18:00

2 réponses

puisque nous sommes tous des suppositions, je pourrais aussi bien donner le mien: j'ai toujours pensé qu'il signifiait Python. Ça peut sembler assez stupide -- quoi, P pour Python?! -- mais pour ma défense, je me suis vaguement souvenu ce fil [souligné par moi]:

Objet: Revendication (?P...) extensions de syntaxe regex

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

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

j'ai une requête inhabituelle pour les développeurs Perl (ceux qui développent le langage Perl). J'espère que ce (perl5-porteurs) est la liste de droite. Je am cc'ING la chaîne de Python-sig parce qu'il est l'origine de la plupart des le travail que je suis en train de parler ici.

vous êtes probablement au courant de Python. Je suis le créateur de Python; je suis projet de sortie d'une prochaine version" majeure", Python 1.5, d'ici la fin de cette année. J'espère que Python et Perl peuvent coexister dans les années à venir; la pollinisation croisée peut être bon pour les deux langues. (Je crois que Larry a eu un bon regard sur Python quand 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 de la La syntaxe Perl dans la syntaxe de Python. Toutefois, le regex la syntaxe a quelques extensions spécifiques à Python, commencer avec (?P. Actuellement, il y en a deux:

(?P<foo>...) semblable aux parenthèses de regroupement régulier, mais le texte

appariés par le groupe est accessible après le match 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". Équivalent à \1, \2,etc. sauf que le groupe est dénommé

de par nom, pas de numéro.

j'espère que cette extension spécifique à Python n'entrera en conflit avec aucune futures extensions Perl à la syntaxe Perl regex. Si vous avez des plans pour utiliser (?P, veuillez nous le faire savoir le plus tôt possible afin que nous puissions résoudre le conflit. sinon, ce serait bien si le (?La syntaxe P pourrait être réservé en permanence pour les extensions de syntaxe spécifiques à Python. (Is il y a une sorte de registre des extensions?)

à laquelle Larry Wall a répondu:

[...] Il n'y a pas de Registre pour le moment--la vôtre est la première demande de hors perl5-porters, donc c'est une activité à bande passante assez faible. (Désolé c'était encore plus bas la semaine dernière--j'étais à New York sur Internet Monde.)

en tout cas, en ce qui me concerne, vous avez certainement 'P' avec mon bénédiction. (De toute évidence Perl n'a pas besoin du " P " à ce stade. : -) [...]

donc je ne sais pas ce qui a motivé le choix initial de P -- motif? espace réservé? les pingouins? -- mais vous pouvez comprendre pourquoi je l'ai toujours associé à Python. Considérant que (1) Je n'aime pas les expressions régulières et les éviter dans la mesure du possible, et (2) ce fil est arrivé il y a quinze ans, c'est un peu bizarre.

178
répondu DSM 2012-04-08 16:00:32

motif! Le groupe nomme un motif (sub)pour utilisation ultérieure dans le regex. Voir la documentation ici pour plus de détails sur la façon dont ces groupes sont utilisés.

15
répondu Mike 2012-04-08 01:26:59