2012-04-08 13 views
98

En Python, el (?P<group_name>…)syntax permite que uno se refieren a la cadena coincidente a través de su nombre:Grupo de expresión regular con nombre "(? P <group_name> regexp)": ¿qué significa "P"?

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

¿Qué significa "P" representa? No pude encontrar ninguna pista en el official documentation.

Me gustaría obtener ideas sobre cómo ayudar a mis alumnos a recordar esta sintaxis. Saber qué significa "P" (o podría significar) sería útil.

+3

'P' significa' Placeholder'. – kev

+0

@kev: parece que eso debería ser una respuesta? – ninjagecko

+3

Como las conjeturas son apropiadas, conjeturo que Ken Thompson es un simpatizante hippie y que la "P" significa "Patchouli". – aaronasterling

Respuesta

149

Dado que todos estamos adivinando, también podría dar el mío: siempre he pensado que era para Python. Eso puede sonar bastante estúpido, ¿qué, P para Python? - pero en mi defensa, me recordaba vagamente this thread [el énfasis es mío]:

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

Desde: Guido van Rossum (GUI ... @ CNRI.Reston.Va.US)

Fecha: 10 Dec, de 1997 03:36:19 pm

tengo una petición inusual para los desarrolladores de Perl (los que se desarrollan el lenguaje Perl). Espero que esto (perl5-porters) sea la lista correcta. I estoy citando el Python string-sig porque es el origen de la mayoría de el trabajo que estoy discutiendo aquí.

Probablemente conozca Python. Soy el creador de Python; Estoy planeando lanzar una próxima versión "importante", Python 1.5, para el final de este año. Espero que Python y Perl puedan coexistir en los años venideros; La polinización cruzada puede ser buena para ambos idiomas. (Creo que Larry tenía un buen aspecto en Python cuando añadió a objetos de Perl 5;. O'Reilly publica libros sobre ambos idiomas)

Como usted sabe, Python 1.5 añade un nuevo módulo de expresión regular que más estrechamente coincide con la sintaxis de Perl. Intentamos estar lo más cerca posible de la sintaxis 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 ellos:

(?P<foo>...) Al igual que en paréntesis de agrupación regulares, pero el texto
emparejado por el grupo es accesibles después de que el partido se ha realizado, a través de el nombre del grupo simbólico "foo".

(?P=foo) juego la misma cadena como que acompañado por el grupo llamado "foo". equivalente a \ 1, \ 2, etc., excepto que el grupo se refiere
a por nombre, no número.

Espero que esta extensión específica de Python no entre en conflicto con las futuras extensiones de Perl de la sintaxis de expresiones regulares de Perl. Si tiene planes para usar (? P, háganoslo saber lo antes posible para que podamos resolver el conflicto ).?. De lo contrario, sería bueno si la sintaxis (P podría ser permanentemente reservada para las extensiones de sintaxis de Python-específicos (Is existe algún tipo de registro de extensiones)

al que respondió Larry Wall?:

[...] no hay registro a partir de ahora -. tuya es la primera solicitud de fuera Perl5-porteros, por lo que es una actividad muy poco ancho de banda (sentimos que era aún menor de semana pasado -Estaba en Nueva York en Internet World.)

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

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

+3

"Extensión específica de Python", tal vez? – jmort253

+23

Guau, ¡aquí encontró información buena y relevante de datos históricos! Mi interpretación de la publicación de Guido es que "P" significa "extensiones específicas de Python". – EOL

+1

Sí, eso me parece definitivo. Por lo tanto, es irónico que Perl y PCRE inicialmente copiaran la sintaxis, solo porque Python fue el primero en admitir capturas con nombre. Pero también admiten la sintaxis '(? ...)', que parece ser la más popular, incluso ahora la soporta Java. –

11

Patrón! El grupo nombra un (sub) patrón para su uso posterior en la expresión regular. Consulte the documentation here para obtener detalles sobre cómo se usan dichos grupos.

+3

+1: Este es un buen dispositivo mnemotécnico: '(? P ...)' es "nombre de patrón' ". Sin embargo, todo es un patrón en una expresión regular, por lo que es un poco extraño etiquetar solo grupos '(? P <…> ...)' como patrones. Esto hará, sin embargo, para mis estudiantes. :) – EOL

+0

@EOL no enseña cosas falsas a los estudiantes. Son más difíciles de destruir cuando alcanzas la exactitud de lo que piensas. P.ej. algunos, para mí, lleva años múltiples de '5'. Paradójicamente, se anima a hablar casualmente, solo que siempre sea muy claro y explícito al respecto, por ejemplo. diga su comentario anterior en longitud completa a sus estudiantes (revisando tal vez la última oración;).) – n611x007

Cuestiones relacionadas