Benannte reguläre Ausdrucksgruppe "(? P <Gruppenname> regulärer Ausdruck)": Wofür steht "P"?

177

In Python erlaubt die (?P<group_name>…) Syntax, über den Namen auf die übereinstimmende Zeichenfolge zu verweisen:

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

Wofür steht "P"? Ich konnte keinen Hinweis in der offiziellen Dokumentation finden .

Ich würde gerne Ideen bekommen, wie ich meinen Schülern helfen kann, sich an diese Syntax zu erinnern. Zu wissen, wofür "P" steht (oder stehen könnte), wäre nützlich.

Eric O Lebigot
quelle
8
Psteht für Placeholder.
Kev
1
@kev: scheint das eine antwort zu sein?
Ninjagecko
3
Da Vermutungen angebracht sind, vermute ich, dass Ken Thompson ein Hippie-Sympathisant ist und das "P" für "Patchouli" steht.
Aaronasterling
2
Diese Frage wurde zu den häufig gestellten Fragen zum Stapelüberlauf für reguläre Ausdrücke unter "Gruppen" hinzugefügt .
Aliteralmind
6
Übrigens, wenn Sie match.groups(mit einem s) verwenden, erhalten Sie stillschweigend ein Tupel aller Gruppen -_- groups('name')=>, ('John', '123456')wenn Sie tatsächlich wollten group('name')=> 'John' Ich hoffe, dies spart jemandem irgendwo einige Zeit (en).
Szmoore

Antworten:

259

Da wir alle raten, könnte ich genauso gut meine geben: Ich habe immer gedacht, dass es für Python steht. Das klingt vielleicht ziemlich dumm - was, P für Python?! - aber zu meiner Verteidigung erinnerte ich mich vage an diesen Thread [Hervorhebung von mir]:

Betreff: Regex-Syntaxerweiterungen beanspruchen (? P ...)

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

Datum: 10. Dezember 1997, 15:36:19 Uhr

Ich habe eine ungewöhnliche Anfrage an die Perl-Entwickler (diejenigen, die die Perl-Sprache entwickeln). Ich hoffe das (perl5-porters) ist die richtige Liste. Ich mache das Python-String-Sig, weil es der Ursprung der meisten Arbeiten ist, die ich hier diskutiere.

Sie kennen wahrscheinlich Python. Ich bin Pythons Schöpfer; Ich plane, bis Ende dieses Jahres eine nächste "Haupt" -Version, Python 1.5, zu veröffentlichen. Ich hoffe, dass Python und Perl in den kommenden Jahren nebeneinander existieren können. Fremdbestäubung kann für beide Sprachen gut sein. (Ich glaube, Larry hat sich Python genau angesehen, als er Objekte zu Perl 5 hinzufügte. O'Reilly veröffentlicht Bücher über beide Sprachen.)

Wie Sie vielleicht wissen, fügt Python 1.5 ein neues Modul für reguläre Ausdrücke hinzu, das der Perl-Syntax besser entspricht. Wir haben versucht, der Perl-Syntax innerhalb der Python-Syntax so nahe wie möglich zu kommen. Die Regex-Syntax enthält jedoch einige Python-spezifische Erweiterungen, die alle mit (? P beginnen. Derzeit gibt es zwei davon:

(?P<foo>...)Ähnlich wie bei normalen Gruppierungsklammern, jedoch ist der
von der Gruppe übereinstimmende Text nach dem Abgleich über den symbolischen Gruppennamen "foo" zugänglich.

(?P=foo)Entspricht der gleichen Zeichenfolge wie die der Gruppe "foo". Entspricht \ 1, \ 2 usw., außer dass die Gruppe
mit Namen und nicht mit Nummer bezeichnet wird.

Ich hoffe, dass diese Python-spezifische Erweiterung nicht mit zukünftigen Perl-Erweiterungen der Perl-Regex-Syntax in Konflikt steht. Wenn Sie Pläne Verwendung haben (? P, informieren Sie uns bitte so schnell wie möglich wissen , damit wir den Konflikt lösen können. Andernfalls wäre es schön, wenn das (? P Syntax permanent für Python-spezifischen Syntax Erweiterungen reserviert werden. (Is gibt es eine Art Registrierung von Erweiterungen?)

worauf Larry Wall antwortete:

[...] Derzeit gibt es keine Registrierung - Ihre ist die erste Anfrage von externen Perl5-Trägern, daher handelt es sich um eine Aktivität mit ziemlich geringer Bandbreite. (Entschuldigung, es war letzte Woche noch niedriger - ich war in New York bei Internet World.)

Sowieso, soweit es mich betrifft, können Sie sicher 'P' mit meinem Segen haben. (Offensichtlich braucht Perl das 'P' zu diesem Zeitpunkt nicht. :-) [...]

Ich weiß also nicht, durch was die ursprüngliche Wahl von P motiviert war - Muster? Platzhalter? Pinguine? - aber Sie können verstehen, warum ich es immer mit Python verbunden habe. Was angesichts der Tatsache, dass (1) ich reguläre Ausdrücke nicht mag und sie nach Möglichkeit meide und (2) dieser Thread vor fünfzehn Jahren passiert ist, seltsam ist.

DSM
quelle
4
"Python-spezifische Erweiterung" vielleicht?
jmort253
49
Wow, Sie haben hier einige gute und relevante historische Daten gefunden! Meine Interpretation von Guidos Beitrag ist, dass "P" für "Python-spezifische Erweiterungen" steht.
Eric O Lebigot
1
Ja, das sieht für mich definitiv aus. Es ist also ironisch, dass Perl und PCRE die Syntax ursprünglich kopiert haben, nur weil Python die erste Variante war, die benannte Captures unterstützte. Sie unterstützen aber auch die (?<group_name>…)Syntax, die am beliebtesten zu sein scheint - sogar Java unterstützt sie jetzt.
Alan Moore
3
+1 Dies ist eine der besten umständlichen Antworten, die gut verteidigt ist :). Zuerst fand ich das zu dumm. Aber am Ende stimmte ich voll und ganz zu.
Sumudu
4
Ich finde es toll, dass sogar der Schöpfer von Python eine bizarre arkane Syntax verwendet, wenn Perl involviert ist, und die Perl-Community ist damit völlig einverstanden. Wenn Sie versuchen würden, Python Perl-spezifische Erweiterungen / Syntax hinzuzufügen, wäre Blut auf den Straßen.
Keith Ripley
20

Muster! Die Gruppe benennt ein (Unter-) Muster zur späteren Verwendung in der Regex. Einzelheiten zur Verwendung solcher Gruppen finden Sie in der Dokumentation hier .

Mike
quelle
3
+1: Dies ist ein gutes Gedächtnisgerät: (?P<name>…)ist "Muster name". Alles ist jedoch ein Muster in einem regulären Ausdruck, daher ist es seltsam, nur (?P<…>…)Gruppen als Muster zu kennzeichnen . Dies wird jedoch für meine Schüler reichen. :)
Eric O Lebigot
1
@EOL bringt den Schülern keine falschen Dinge bei. Sie sind schwerer abzureißen, wenn Sie nach Genauigkeit greifen, als Sie denken. Z.B. Einige dauern für mich mehrere Jahre 5. Paradoxerweise wird empfohlen, beiläufig zu sprechen, nur immer sehr klar und deutlich darüber zu sprechen - z. Sagen Sie Ihren Schülern Ihren vorherigen Kommentar in voller Länge (vielleicht überarbeiten Sie den allerletzten Satz;).)
n611x007
5

Python-Erweiterung. Aus den Python-Dokumenten:

Die von den Perl-Entwicklern gewählte Lösung bestand darin, (? ...) als Erweiterungssyntax zu verwenden. ? unmittelbar nach einer Klammer war ein Syntaxfehler, weil die? hätte nichts zu wiederholen, so dass dies keine Kompatibilitätsprobleme verursachte. Die Charaktere unmittelbar nach dem? Geben Sie an, welche Erweiterung verwendet wird. (? = foo) ist also eine Sache (eine positive Lookahead-Behauptung) und (?: foo) eine andere (eine nicht erfassende Gruppe, die den Unterausdruck foo enthält).

Python unterstützt mehrere Perl-Erweiterungen und fügt der Perl-Erweiterungssyntax eine Erweiterungssyntax hinzu. Wenn das erste Zeichen nach dem Fragezeichen ein P ist, wissen Sie, dass es sich um eine Python-spezifische Erweiterung handelt

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

Irgendein Typ
quelle
Gut erkannt! Dies bestätigt das Gefühl von DSM.
Eric O Lebigot