Gruppo di espressioni regolari denominato "(? P <group_name> regexp)": cosa significa "P"?


178

In Python, la (?P<group_name>…) sintassi consente di fare riferimento alla stringa corrispondente tramite il suo nome:

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

Cosa significa "P"? Non ho trovato alcun suggerimento nella documentazione ufficiale .

Mi piacerebbe avere idee su come aiutare i miei studenti a ricordare questa sintassi. Sapere cosa significa "P" (o potrebbe rappresentare) sarebbe utile.


8
Psta per Placeholder.
kev

1
@kev: sembra che dovrebbe essere una risposta?
ninjagecko

3
Dato che le ipotesi sono appropriate, suppongo che Ken Thompson sia un simpatizzante hippy e la "P" sta per "Patchouli".
aaronasterling

2
Questa domanda è stata aggiunta alle FAQ sulle espressioni regolari di Stack Overflow , in "Gruppi".
aliteralmind

6
A proposito, se usi match.groups(con un s) otterrai silenziosamente una tupla di tutti i gruppi -_- groups('name')=> ('John', '123456')quando quello che volevi effettivamente era group('name')=> 'John' Spero che questo salvi qualcuno da qualche parte.
szmoore,

Risposte:


262

Dato che tutti indoviniamo, potrei anche dare il mio: ho sempre pensato che fosse Python. Può sembrare piuttosto stupido - cosa, P per Python ?! - ma a mia difesa, ho vagamente ricordato questo thread [enfatizzare il mio]:

Oggetto: Rivendicazione (? P ...) estensioni della sintassi della regex

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

Data: 10 dic 1997 15:36:19

Ho una richiesta insolita per gli sviluppatori Perl (quelli che sviluppano il linguaggio Perl). Spero che questo (perl5-porters) sia la lista giusta. Sto scrivendo il Python string-sig perché è l'origine della maggior parte del lavoro di cui sto discutendo qui.

Probabilmente sei a conoscenza di Python. Sono il creatore di Python; Sto programmando di rilasciare una prossima versione "principale", Python 1.5, entro la fine di quest'anno. Spero che Python e Perl possano coesistere negli anni a venire; l'impollinazione incrociata può essere utile per entrambe le lingue. (Credo che Larry abbia dato una buona occhiata a Python quando ha aggiunto oggetti a Perl 5; O'Reilly pubblica libri su entrambe le lingue.)

Come forse saprai, Python 1.5 aggiunge un nuovo modulo di espressione regolare che si avvicina maggiormente alla sintassi di Perl. Abbiamo cercato di essere il più vicino possibile alla sintassi Perl all'interno della sintassi di Python. Tuttavia, la sintassi regex ha alcune estensioni specifiche di Python, che iniziano tutte con (? P. Attualmente ce ne sono due:

(?P<foo>...)Simile alle normali parentesi di raggruppamento, ma il testo
corrispondente al gruppo è accessibile dopo che la corrispondenza è stata eseguita, tramite il nome simbolico del gruppo "pippo".

(?P=foo)Corrisponde alla stessa stringa corrispondente a quella del gruppo "pippo". Equivalente a \ 1, \ 2, ecc. Tranne per il fatto che al gruppo viene fatto riferimento
per nome, non per numero.

Spero che questa estensione specifica di Python non sia in conflitto con eventuali future estensioni Perl alla sintassi della regex del Perl. Se avete intenzione di utilizzare (? P, fatecelo sapere al più presto possibile in modo che possiamo risolvere il conflitto. In caso contrario, sarebbe bello se il (? Sintassi P potrebbe essere riservato in modo permanente per le estensioni di sintassi Python-specifiche. (Is c'è una specie di registro delle estensioni?)

a cui Larry Wall rispose:

[...] Al momento non esiste alcun registro: la tua è la prima richiesta dall'esterno di perl5-porter, quindi è un'attività a larghezza di banda piuttosto bassa. (Mi dispiace che la settimana scorsa fosse ancora più bassa - ero fuori a New York su Internet World.)

Ad ogni modo, per quanto mi riguarda, potresti sicuramente avere 'P' con la mia benedizione. (Ovviamente Perl non ha bisogno della 'P' a questo punto. :-) [...]

Quindi non so quale sia stata la motivazione della scelta originale di P - pattern? segnaposto? pinguini? - ma puoi capire perché l'ho sempre associato a Python. Il che, considerando che (1) non mi piacciono le espressioni regolari ed evitarle laddove possibile, e (2) questa discussione è avvenuta quindici anni fa, è un po 'strano.


4
"Estensione specifica di Python" forse?
jmort253,

50
Caspita, hai trovato alcuni dati storici validi e pertinenti, qui! La mia interpretazione del post di Guido è che "P" sta per "estensioni specifiche di Python".
Eric O Lebigot,

1
Sì, mi sembra definitivo. Quindi è ironico che Perl e PCRE abbiano inizialmente copiato la sintassi, solo perché Python è stato il primo sapore a supportare le acquisizioni con nome. Ma supportano anche la (?<group_name>…)sintassi, che sembra essere la più popolare - anche Java ora la supporta.
Alan Moore,

3
+1 Questa è una delle migliori risposte scomode che è ben difesa :). All'inizio, ho pensato che fosse troppo stupido. Ma alla fine, sono totalmente d'accordo.
Sumudu

4
Adoro il fatto che anche il creatore di Python usi una bizzarra sintassi arcana quando Perl è coinvolto, e la comunità Perl è assolutamente d'accordo. Se provassi ad aggiungere estensioni / sintassi specifiche di Perl a Python, ci sarebbe sangue nelle strade.
Keith Ripley,

20

Modello! Il gruppo nomina un (sotto) modello per un uso successivo nella regex. Vedere la documentazione qui per i dettagli su come tali gruppi vengono utilizzati.


3
+1: Questo è un buon dispositivo mnemonico: (?P<name>…)è "modello name". Tutto è uno schema, tuttavia, in una regexp, quindi è strano etichettare solo i (?P<…>…)gruppi come schemi. Questo farà, tuttavia, per i miei studenti. :)
Eric O Lebigot

1
@EOL non insegna agli studenti cose false. Sono più difficili da eliminare quando si raggiunge l'esattezza di quanto si pensi. Per esempio. alcuni, per me, richiedono anni multipli di 5. Paradossalmente, è incoraggiato a parlare casualmente, solo essere sempre molto chiari ed espliciti al riguardo - ad es. racconta il tuo commento precedente in modo completo ai tuoi studenti (rivedendo forse l'ultima frase;).)
n611x007

5

Estensione Python. Da Python Docos:

La soluzione scelta dagli sviluppatori Perl era quella di usare (? ...) come sintassi dell'estensione. ? subito dopo una parentesi si è verificato un errore di sintassi perché il? non avrebbe nulla da ripetere, quindi questo non ha introdotto problemi di compatibilità. I personaggi immediatamente dopo il? indica quale estensione viene utilizzata, quindi (? = pippo) è una cosa (un'asserzione di lookahead positiva) e (?: pippo) è qualcos'altro (un gruppo non catturante contenente il pippo in sottoespressione).

Python supporta diverse estensioni di Perl e aggiunge una sintassi di estensione alla sintassi di estensione di Perl. Se il primo carattere dopo il punto interrogativo è una P, sai che si tratta di un'estensione specifica di Python

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


Ben individuato! Ciò conferma la sensazione di DSM.
Eric O Lebigot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.