Normal ifade grubu “(? P <group_name> regexp)” olarak adlandırıldı: “P” ne anlama geliyor?


178

Python'da (?P<group_name>…) sözdizimi , kişinin eşleşen dizeye adıyla başvurmasını sağlar:

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

"P" ne anlama geliyor? Resmi belgelerde herhangi bir ipucu bulamadım .

Öğrencilerimin bu sözdizimini hatırlamasına nasıl yardımcı olabileceğim konusunda fikir edinmek isterim. "P" nin neyi temsil ettiğini (veya neyi temsil ettiğini) bilmek faydalı olacaktır.


8
Panlamına gelir Placeholder.
kev

1
@kev: Bu bir cevap mı olmalı?
ninjagecko

3
Tahminler uygun olduğu için Ken Thompson'ın bir hippi sempatizanı olduğunu ve "P" nin "Paçuli" anlamına geldiğini düşünüyorum.
aaronasterling

2
Bu soru, "Gruplar" altında Yığın Taşması Düzenli İfade SSS'ye eklenmiştir .
aliteralmind

6
Bu arada, match.groups(an ile s) kullanırsanız, sessizce tüm gruplardan bir demet alırsınız.groups('name') => ('John', '123456')Aslında istediğiniz şey group('name')=> olduğunda, 'John' umarım bu bir yere bir süre tasarruf sağlar.
szmoore

Yanıtlar:


262

Hepimiz tahmin ettiğimizden, benimkini de verebilirim: Her zaman Python'un durduğunu düşündüm. Bu oldukça aptalca gelebilir - ne, Python için P ?! - ama savunmamda, bu konuyu belirsiz bir şekilde hatırladım [benimki vurgu]:

Konu: Düzenli ifade (? P ...) normal ifade sözdizimi uzantıları

Gönderen: Guido van Rossum (gui ... @ CNRI.Reston.Va.US)

Tarih: 10 Ara 1997 15:36:19

Perl geliştiricileri (Perl dilini geliştirenler) için alışılmadık bir isteğim var. Umarım bu (perl5-porters) doğru listedir. Python string-sig'ı kullanıyorum çünkü burada tartıştığım işlerin çoğunun kaynağı bu.

Muhtemelen Python'un farkındasınızdır. Ben Python'un yaratıcısıyım; Bu yılın sonuna kadar bir sonraki "büyük" sürümü Python 1.5'i yayınlamayı planlıyorum. Umarım Python ve Perl önümüzdeki yıllarda birlikte yaşayabilirler; çapraz tozlaşma her iki dil için de iyi olabilir. (Perl 5'e nesne eklerken Larry'nin Python'a iyi baktığına inanıyorum; O'Reilly her iki dil hakkında da kitap yayınlıyor.)

Bildiğiniz gibi Python 1.5, Perl'in sözdizimiyle daha yakından eşleşen yeni bir normal ifade modülü ekler. Python'un sözdiziminde Perl sözdizimine olabildiğince yakın olmaya çalıştık. Bununla birlikte, normal ifade sözdiziminde tümü ile başlayan bazı Python'a özgü uzantılar vardır (? P. Şu anda bunlardan iki tane var:

(?P<foo>...) Normal gruplama parantezlerine benzer, ancak metin
grup tarafından eşleşen eşleştirme gerçekleştirildikten sonra sembolik grup adı "foo" aracılığıyla erişilebilir.

(?P=foo)"Foo" adlı grupla aynı dizeyle eşleşir. Grubun yönlendirilmesi dışında \ 1, \ 2 vb. İle eşdeğerdir
sayı ile değil adla gerekir.

Umarım bu Python'a özgü uzantı Perl regex sözdiziminin gelecekteki Perl uzantılarıyla çakışmaz. Kullanım planlarınız varsa (? P, çakışmayı çözebilmemiz için lütfen en kısa sürede bize bildirin. (? P sözdizimi kalıcı Python özgü sözdizimi uzantıları için ayrılmış olabilir Aksi takdirde, çok güzel olurdu. (Is uzantıları bir tür kayıt var mı?)

Larry Wall'un cevapladığı:

[...] Şu an için hiçbir kayıt yok - sizinki perl5-porters dışından gelen ilk istek, bu yüzden oldukça düşük bant genişliği etkinliği. (Maalesef geçen hafta daha da düşüktü - İnternet Dünyasında New York'taydım.)

Her neyse, endişelendiğim kadarıyla, kutsamamla kesinlikle 'P' olabilir. (Açıkçası Perl'in bu noktada 'P' ye ihtiyacı yok. :-) [...]

Peki orijinal P seçiminin neden motive olduğunu bilmiyorum? Yer tutucu? penguenler? - ama neden her zaman Python ile ilişkilendirdiğimi anlayabilirsiniz. (1) Düzenli ifadeleri sevmiyorum ve mümkün olan yerlerde bunlardan uzak duruyorum ve (2) bu konu on beş yıl önce oldu, biraz garip.


4
"Python'a özgü uzantı" belki?
jmort253

50
Vay canına, burada iyi ve alakalı tarihsel veriler buldunuz! Guido'nun gönderisine ilişkin yorumum, "P" nin "Python'a özgü uzantılar" anlamına geldiğidir.
Eric O Lebigot

1
Evet, bu benim için kesin görünüyor. Bu yüzden Perl ve PCRE'nin başlangıçta sözdizimini kopyalaması ironiktir, çünkü Python adlandırılmış yakalamaları destekleyen ilk lezzettir. Ama aynı zamanda (?<group_name>…)en popüler gibi görünen sözdizimini de destekliyorlar - Java bile şimdi destekliyor.
Alan Moore

3
+1 Bu iyi savunulan en garip cevaplardan biridir :). İlk başta, bunun çok aptalca olduğunu düşündüm. Ama sonunda tamamen kabul ettim.
Sumudu

4
Python'un yaratıcısının bile Perl söz konusu olduğunda tuhaf gizemli sözdizimi kullandığını ve Perl topluluğunun bu konuda tamamen iyi olduğunu seviyorum. Python'a Perl'e özgü uzantılar / sözdizimi eklemeye çalışırsanız, sokaklarda kan olurdu.
Keith Ripley

20

Desen! Grup, daha sonra normal ifadede kullanılmak üzere bir (alt) kalıbı adlandırır. Bu tür grupların nasıl kullanıldığı hakkında ayrıntılar için buradaki belgelere bakın .


3
+1: Bu iyi bir anımsatıcı cihaz: (?P<name>…)"kalıp name". Gerçi her şey bir normal ifade ile bir kalıptır, bu yüzden sadece (?P<…>…)grupları kalıp olarak etiketlemek gariptir . Ancak bu öğrencilerim için de geçerli. :)
Eric O Lebigot

1
@EOL öğrencilere yanlış şeyler öğretmez. Kesinlik için düşündüğünüzden daha fazla parçalamak daha zordur. Örneğin. bazıları, benim için, yıllar kat kat alır 5. Paradoksal olarak, rahatça konuşmaya teşvik edilir, sadece her zaman çok açık ve açık olun - örneğin. önceki yorumunuzu öğrencilerinize tam olarak söyleyin (belki de en son cümleyi gözden geçirin;).)
n611x007

5

Python Uzantısı. Python Docos'tan:

Perl geliştiricileri tarafından seçilen çözüm, uzatma sözdizimi olarak (? ...) kullanılacaktı. ? parantezden hemen sonra sözdizimi hatası oldu çünkü? yinelenecek bir şey olmayacak, bu nedenle uyumluluk sorunları ortaya çıkmadı. ? Karakterinden hemen sonra? hangi uzantının kullanıldığını belirtin, bu nedenle (? = foo) bir şeydir (olumlu bir ileri doğru iddiası) ve (?: foo) başka bir şeydir (alt ifade foosunu içeren yakalamayan bir grup).

Python, Perl'in birkaç uzantısını destekler ve Perl'in uzantı sözdizimine bir uzantı sözdizimi ekler. Soru işaretinden sonraki ilk karakter P ise, bunun Python'a özgü bir uzantı olduğunu bilirsiniz

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


İyi tespit! Bu, DSM'nin hissini doğrular.
Eric O Lebigot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.