web-dev-qa-db-fra.com

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

En Python, le (?P<group_name>…)syntaxe permet de faire référence à 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 trouvé aucun indice dans le documentation officielle .

J'aimerais avoir des idées sur la façon d'aider mes étudiants à se rappeler cette syntaxe. Savoir ce que "P" représente (ou pourrait représenter) serait utile.

151
Eric O Lebigot

Puisque nous sommes tous en train de deviner, je pourrais aussi bien donner le mien. Cela peut paraître assez stupide - quoi, P pour Python?! - mais dans ma défense, je me souvenais vaguement ce fil [souligné par moi]:

Subject: Revendication (? P ...) des extensions de syntaxe regex

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

Date: 10 décembre 1997 15h36:19

J'ai une demande inhabituelle pour les développeurs Perl (ceux qui développent le langage Perl). J'espère que ceci (porteurs de Perl5) est la bonne liste. Je copie le Python string-sig parce que c’est l’origine de la plupart des travaux dont je parle ici.

Vous êtes probablement au courant de Python. Je suis le créateur de Python. Je prévois de publier 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 bénéfique pour les deux langues. (Je pense que Larry a bien regardé Python lorsqu'il a ajouté des objets à Perl 5; O'Reilly a publié 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é de nous rapprocher le plus possible de la syntaxe Perl dans la syntaxe de Python. Cependant, la syntaxe regex a certaines 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
apparié par le groupe est accessible après le match, via le nom symbolique du groupe "foo".

(?P=foo) Correspond à la même chaîne que celle du groupe nommé "foo". Équivalent à\1,\2, etc. sauf que le groupe est référé
par nom et non par numéro.

J'espère que cette extension spécifique à Python ne sera pas en conflit avec les futures extensions Perl de la syntaxe Perl regex. Si vous envisagez d’utiliser (? P, veuillez nous en informer au plus vite afin que nous puissions résoudre le conflit. Sinon, ce serait bien si la syntaxe (? P pouvait être réservée en permanence pour les extensions de syntaxe spécifiques à Python. (Existe-t-il un type de registre d'extensions?)

auquel Larry Wall a répondu:

[...] Il n'y a pas de registre pour l'instant - votre demande est la première demande de l'extérieur des porteurs de Perl5, donc c'est une activité à faible bande passante. (Désolé, c'était encore plus bas la semaine dernière. J'étais à New York chez Internet World.)

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

Donc, je ne sais pas ce qui a motivé le choix initial de P? espace réservé? des pingouins? - mais vous pouvez comprendre pourquoi je l'ai toujours associé à Python. Le fait de considérer que (1) je n'aime pas les expressions régulières et les évite autant que possible, et (2) ce fil est arrivé il y a quinze ans, est plutôt étrange.

217
DSM

Modèle! Le groupe nomme un motif (sous) pour une utilisation ultérieure dans la regex. Voir la documentation ici pour plus de détails sur l’utilisation de ces groupes.

18
Mike