Grupo de expressão regular nomeado “(? P <group_name> regexp)”: o que significa “P”?

178

No Python, a (?P<group_name>…) sintaxe permite referir-se à string correspondente através de seu nome:

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

O que significa "P"? Não encontrei nenhuma dica na documentação oficial .

Gostaria muito de ter idéias sobre como ajudar meus alunos a se lembrar dessa sintaxe. Saber o que "P" representa (ou pode representar) seria útil.

Eric O Lebigot
fonte
8
Psignifica Placeholder.
Kev #
1
@ kev: parece que isso deve ser uma resposta?
Ninjagecko
3
Como suposições são apropriadas, suponho que Ken Thompson seja um simpatizante dos hippies e o "P" represente "Patchouli".
precisa saber é o seguinte
2
Esta pergunta foi adicionada às Perguntas frequentes sobre a expressão regular de estouro de pilha , em "Grupos".
Alreralmind
6
A propósito, se você usar match.groups(com um s), silenciosamente obterá uma tupla de todos os grupos -_- groups('name')=> ('John', '123456')quando o que você realmente queria era group('name')=> 'John' Espero que isso salve alguém em algum lugar em algum momento.
Szmoore

Respostas:

262

Como todos nós estamos adivinhando, eu também poderia dar o meu: eu sempre pensei que isso representasse o Python. Isso pode parecer muito estúpido - o que, P para Python ?! - mas em minha defesa, lembrei - me vagamente deste tópico [grifo meu]:

Assunto: Reivindicando (? P ...) extensões de sintaxe regex

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

Data: 10 de dezembro de 1997 15:36:19 pm

Eu tenho uma solicitação incomum para os desenvolvedores Perl (aqueles que desenvolvem a linguagem Perl). Espero que esta (perl5-porters) seja a lista correta. Estou cc'ing a string-sig do Python, porque é a origem da maior parte do trabalho que estou discutindo aqui.

Você provavelmente conhece o Python. Eu sou o criador do Python; Estou planejando lançar uma próxima versão "principal", Python 1.5, até o final deste ano. Espero que Python e Perl possam coexistir nos próximos anos; a polinização cruzada pode ser boa para os dois idiomas. (Acredito que Larry deu uma boa olhada no Python quando adicionou objetos ao Perl 5; O'Reilly publica livros sobre os dois idiomas.)

Como você deve saber, o Python 1.5 adiciona um novo módulo de expressão regular que mais se aproxima da sintaxe do Perl. Tentamos estar o mais próximo possível da sintaxe Perl na sintaxe do Python. No entanto, a sintaxe regex possui algumas extensões específicas do Python, que começam com (? P. Atualmente, existem duas delas:

(?P<foo>...)Semelhante aos parênteses de agrupamento regulares, mas o texto
correspondido pelo grupo fica acessível após a realização da partida, por meio do nome simbólico do grupo "foo".

(?P=foo)Corresponde à mesma string que corresponde ao grupo chamado "foo". Equivalente a \ 1, \ 2, etc., exceto que o grupo é referido
pelo nome, não pelo número.

Espero que essa extensão específica do Python não entre em conflito com nenhuma extensão futura do Perl na sintaxe do regex do Perl. Se você planeja usar (? P, informe-nos o mais rápido possível para que possamos resolver o conflito. Caso contrário, seria bom se a sintaxe (? P pudesse ser permanentemente reservada para extensões de sintaxe específicas do Python. ) existe algum tipo de registro de extensões?)

ao qual Larry Wall respondeu:

[...] Não há registro a partir de agora - o seu é o primeiro pedido de fora do perl5-porters, por isso é uma atividade de baixa largura de banda. (Desculpe, foi ainda mais baixo na semana passada - eu estava em Nova York na Internet World.)

De qualquer forma, no que me diz respeito, você pode certamente ter 'P' com a minha bênção. (Obviamente, Perl não precisa do 'P' neste momento. :-) [...]

Então, eu não sei qual foi a motivação original da escolha de P? espaço reservado? pinguins? - mas você pode entender por que sempre o associei ao Python. O que, considerando que (1) eu não gosto de expressões regulares e as evito sempre que possível, e (2) esse tópico aconteceu quinze anos atrás, é meio estranho.

DSM
fonte
4
"Extensão específica para Python", talvez?
precisa
50
Uau, você encontrou alguns dados históricos bons e relevantes aqui! Minha interpretação do post de Guido é que "P" significa "extensões específicas do Python".
Eric O Lebigot
1
Sim, isso parece definitivo para mim. Portanto, é irônico que Perl e PCRE inicialmente tenham copiado a sintaxe, apenas porque Python foi o primeiro a oferecer suporte a capturas nomeadas. Mas eles também suportam a (?<group_name>…)sintaxe, que parece ser a mais popular - até o Java suporta agora.
Alan Moore
3
+1 Esta é uma das melhores respostas estranhas e bem defendidas :). No começo, achei isso muito estúpido. Mas no final, eu concordei totalmente.
Sumudu 01/03/19
4
Eu amo que até o criador do Python usa sintaxe misteriosa e estranha quando o Perl está envolvido, e a comunidade Perl está totalmente bem com isso. Se você tentasse adicionar extensões / sintaxe específicas do Perl ao Python, haveria sangue nas ruas.
Keith Ripley
20

Padronizar! O grupo nomeia um (sub) padrão para uso posterior na regex. Consulte a documentação aqui para obter detalhes sobre como esses grupos são usados.

Mike
fonte
3
+1: este é um bom dispositivo mnemônico: (?P<name>…)é "padrão name". Tudo é um padrão, porém, em uma regexp, por isso é meio estranho rotular (?P<…>…)grupos como padrões. Isso servirá para meus alunos. :)
Eric O Lebigot
1
O @EOL não ensina coisas falsas aos alunos. Eles são mais difíceis de fragmentar quando você busca precisão do que pensa. Por exemplo. alguns, para mim, levam vários anos 5. Paradoxalmente, é incentivado a falar casualmente, sempre seja muito claro e explícito sobre isso - por exemplo. informe o seu comentário anterior na íntegra comprimento para os seus alunos (revisando talvez a última frase;)).
n611x007
5

Extensão Python. No Python Docos:

A solução escolhida pelos desenvolvedores do Perl foi usar (? ...) como sintaxe de extensão. ? imediatamente após um parêntese houve um erro de sintaxe porque o? não teria nada para repetir, então isso não introduziu nenhum problema de compatibilidade. Os personagens imediatamente após o? indique qual extensão está sendo usada, então (? = foo) é uma coisa (uma afirmação positiva à vista) e (?: foo) é outra coisa (um grupo não capturador que contém a subexpressão foo).

O Python suporta várias extensões do Perl e adiciona uma sintaxe de extensão à sintaxe de extensão do Perl. Se o primeiro caractere após o ponto de interrogação for um P, você sabe que é uma extensão específica do Python

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

SomeGuy
fonte
Bem manchado! Isso confirma o sentimento do DSM.
Eric O Lebigot