Nombre del grupo de expresiones regulares "(? P <group_name> regexp)": ¿qué significa "P"?

178

En Python, la (?P<group_name>…) sintaxis permite referirse a la cadena coincidente a través de su nombre:

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

¿Qué significa "P"? No pude encontrar ninguna pista en la documentación oficial .

Me encantaría tener ideas sobre cómo ayudar a mis alumnos a recordar esta sintaxis. Sería útil saber qué significa "P" (o podría significar).

Eric O Lebigot
fuente
8
Prepresenta Placeholder.
kev
1
@kev: parece que debería ser una respuesta?
ninjagecko
3
Como las suposiciones son apropiadas, supongo que Ken Thompson es un simpatizante hippie y que la "P" significa "pachulí".
aaronasterling
2
Esta pregunta se ha agregado a las Preguntas frecuentes sobre expresiones regulares de desbordamiento de pila , en "Grupos".
aliteralmind
66
Por cierto, si usa match.groups(con un s) obtendrá en silencio una tupla de todos los grupos -_- groups('name')=> ('John', '123456')cuando lo que realmente quería era group('name')=> 'John' Espero que esto le ahorre a alguien en algún momento.
szmoore

Respuestas:

262

Como todos estamos adivinando, también podría dar el mío: siempre pensé que significaba Python. Eso puede sonar bastante estúpido, ¿qué, P para Python? - pero en mi defensa, recordaba vagamente este hilo [énfasis mío]:

Asunto: Reclamación de extensiones de sintaxis de expresiones regulares (? P ...)

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

Fecha: 10 de diciembre de 1997 3:36:19 pm

Tengo una solicitud inusual para los desarrolladores de Perl (aquellos que desarrollan el lenguaje Perl). Espero que esta (perl5-porters) sea la lista correcta. Estoy copiando el Python string-sig porque es el origen de la mayoría del trabajo que estoy discutiendo aquí.

Probablemente conozcas Python. Soy el creador de Python; Estoy planeando lanzar una próxima versión "principal", Python 1.5, para finales de este año. Espero que Python y Perl puedan coexistir en los próximos años; La polinización cruzada puede ser buena para ambos idiomas. (Creo que Larry observó bien Python cuando agregó objetos a Perl 5; O'Reilly publica libros sobre ambos idiomas).

Como ya sabrás, Python 1.5 agrega un nuevo módulo de expresión regular que coincide más con la sintaxis de Perl. Hemos tratado de estar lo más cerca posible de la sintaxis de Perl dentro de la sintaxis de Python. Sin embargo, la sintaxis de expresiones regulares tiene algunas extensiones específicas de Python, que comienzan con (? P. Actualmente hay dos de ellas:

(?P<foo>...)Similar a los paréntesis de agrupación regulares, pero el texto que
coincide con el grupo es accesible después de que se haya realizado la coincidencia, a través del nombre simbólico del grupo "foo".

(?P=foo)Coincide con la misma cadena que la del grupo llamado "foo". Equivalente a \ 1, \ 2, etc., excepto que se hace referencia
al grupo por nombre, no por número.

Espero que esta extensión específica de Python no entre en conflicto con ninguna extensión futura de Perl a la sintaxis de expresiones regulares de Perl. Si usted tiene planes de utilizar (? P, por favor háganoslo saber tan pronto como sea posible para que podamos resolver el conflicto. De lo contrario, sería bueno si el (? Sintaxis P podría ser permanentemente reservada para las extensiones de sintaxis de Python-específicas. (Is ¿Hay algún tipo de registro de extensiones?)

a lo que Larry Wall respondió:

[...] No hay registro por ahora: la suya es la primera solicitud de perl5-porters externos, por lo que es una actividad de poco ancho de banda. (Lo siento, fue aún más bajo la semana pasada, estaba en Nueva York en Internet World).

De todos modos, en lo que a mí respecta, sin duda puede tener 'P' con mi bendición. (Obviamente, Perl no necesita la 'P' en este momento. :-) [...]

Entonces, no sé cuál fue la elección original de P, ¿por qué patrón? marcador de posición? pingüinos? - pero puedes entender por qué siempre lo he asociado con Python. Considerando que (1) no me gustan las expresiones regulares y las evito siempre que sea posible, y (2) este hilo sucedió hace quince años, es algo extraño.

DSM
fuente
44
¿"Extensión específica de Python" quizás?
jmort253
50
¡Guau, encontraste algunos datos históricos buenos y relevantes aquí! Mi interpretación de la publicación de Guido es que "P" significa "extensiones específicas de Python".
Eric O Lebigot
1
Sí, eso me parece definitivo. Por lo tanto, es irónico que Perl y PCRE copiaran inicialmente la sintaxis, solo porque Python fue la primera versión que admitió capturas con nombre. Pero también admiten la (?<group_name>…)sintaxis, que parece ser la más popular, incluso Java lo admite ahora.
Alan Moore
3
+1 Esta es una de las mejores respuestas incómodas que está bien defendida :). Al principio, pensé que esto era demasiado estúpido. Pero al final, estuve totalmente de acuerdo.
Sumudu
44
Me encanta que incluso el creador de Python use una extraña sintaxis arcana cuando Perl está involucrado, y la comunidad de Perl está totalmente de acuerdo con eso. Si intentara agregar extensiones / sintaxis específicas de Perl a Python, habría sangre en las calles.
Keith Ripley
20

¡Patrón! El grupo nombra un (sub) patrón para su uso posterior en la expresión regular. Consulte la documentación aquí para obtener detalles sobre cómo se utilizan dichos grupos.

Miguel
fuente
3
+1: Este es un buen dispositivo mnemotécnico: (?P<name>…)es "patrón name". Sin embargo, todo es un patrón en una expresión regular, por lo que es extraño etiquetar solo (?P<…>…)grupos como patrones. Sin embargo, esto servirá para mis alumnos. :)
Eric O Lebigot
1
@EOL no enseña a los estudiantes cosas falsas. Son más difíciles de destruir cuando alcanzas la exactitud de lo que piensas. P.ej. algunos, para mí, llevan años múltiples 5. Paradójicamente, se alienta a hablar casualmente, solo siempre sea muy claro y explícito al respecto, por ejemplo. diga todo su comentario anterior a sus alumnos (revisando quizás la última oración;).)
n611x007
5

Extensión Python. De los documentos de Python:

La solución elegida por los desarrolladores de Perl fue usar (? ...) como sintaxis de extensión. ? inmediatamente después de un paréntesis fue un error de sintaxis porque el? no tendría nada que repetir, así que esto no introdujo ningún problema de compatibilidad. Los personajes inmediatamente después del? indique qué extensión se está utilizando, entonces (? = foo) es una cosa (una afirmación anticipada positiva) y (?: foo) es otra cosa (un grupo no capturador que contiene la subexpresión foo).

Python admite varias de las extensiones de Perl y agrega una sintaxis de extensión a la sintaxis de extensión de Perl. Si el primer carácter después del signo de interrogación es una P, sabrá que es una extensión específica de Python

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

Algún chico
fuente
¡Bien descrito! Esto confirma el sentimiento de DSM.
Eric O Lebigot