Dinamakan grup ekspresi reguler "(? P <group_name> regexp)": apa artinya "P"?

178

Dalam Python, (?P<group_name>…) sintaks memungkinkan seseorang untuk merujuk ke string yang cocok melalui namanya:

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

Apa artinya "P"? Saya tidak dapat menemukan petunjuk dalam dokumentasi resmi .

Saya akan senang mendapatkan ide tentang bagaimana membantu siswa saya mengingat sintaks ini. Mengetahui apa artinya "P" berarti (atau mungkin berarti) berarti berguna.

Eric O Lebigot
sumber
8
Psingkatan Placeholder.
kev
1
@ kev: sepertinya itu harus menjadi jawaban?
ninjagecko
3
Karena tebakan itu tepat, saya menduga bahwa Ken Thompson adalah simpatisan hippie dan "P" adalah singkatan dari "Patchouli".
aaronasterling
2
Pertanyaan ini telah ditambahkan ke FAQ Ekspresi Reguler Overflow Overflow , di bawah "Grup".
aliteralmind
6
Ngomong-ngomong, jika Anda menggunakan match.groups(dengan a s) Anda akan diam-diam mendapatkan tuple dari semua grup -_- groups('name')=> ('John', '123456')ketika apa yang sebenarnya Anda inginkan adalah group('name')=> 'John' Saya harap ini menyelamatkan seseorang di suatu waktu.
szmoore

Jawaban:

262

Karena kita semua menebak, saya mungkin juga memberikan milik saya: Saya selalu berpikir itu singkatan dari Python. Itu mungkin terdengar sangat bodoh - apa, P untuk Python ?! - tetapi dalam pembelaan saya, saya samar-samar mengingat utas ini [penekanan milik saya]:

Subjek: Mengklaim (? P ...) regex ekstensi sintaks

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

Tanggal: 10 Des 1997 3:36:19 siang

Saya memiliki permintaan yang tidak biasa untuk pengembang Perl (yang mengembangkan bahasa Perl). Saya harap ini (perl5-porter) adalah daftar yang tepat. Saya cc'ing the Python string-sig karena itu adalah asal dari sebagian besar pekerjaan yang saya bahas di sini.

Anda mungkin sadar akan Python. Saya adalah pencipta Python; Saya berencana untuk merilis versi "utama" berikutnya, Python 1.5, pada akhir tahun ini. Saya berharap bahwa Python dan Perl dapat hidup berdampingan di tahun-tahun mendatang; penyerbukan silang bisa baik untuk kedua bahasa. (Saya percaya Larry melihat Python dengan baik ketika dia menambahkan objek ke Perl 5; O'Reilly menerbitkan buku tentang kedua bahasa.)

Seperti yang Anda ketahui, Python 1.5 menambahkan modul ekspresi reguler baru yang lebih cocok dengan sintaks Perl. Kami telah berusaha sedekat mungkin dengan sintaks Perl dalam sintaksis Python. Namun, sintaks regex memiliki beberapa ekstensi khusus Python, yang semuanya dimulai dengan (? P. Saat ini ada dua di antaranya:

(?P<foo>...)Mirip dengan tanda kurung pengelompokan biasa, tetapi teks yang
cocok dengan grup dapat diakses setelah pertandingan dilakukan, melalui nama grup simbolik "foo".

(?P=foo)Cocok dengan string yang sama seperti yang cocok dengan grup bernama "foo". Setara dengan \ 1, \ 2, dll. Kecuali bahwa grup tersebut disebut
dengan nama, bukan nomor.

Saya berharap bahwa ekstensi khusus Python ini tidak akan bertentangan dengan ekstensi Perl di masa depan dengan sintaks Perl regex. Jika Anda memiliki rencana untuk menggunakan (? P, silakan beritahu kami secepat mungkin sehingga kita dapat menyelesaikan konflik. Jika tidak, itu akan menyenangkan jika (? P sintaks dapat disediakan secara permanen untuk ekstensi sintaks Python-spesifik. (Is ada beberapa jenis ekstensi ekstensi?)

dimana Larry Wall menjawab:

[...] Tidak ada registry pada saat ini - permintaan Anda adalah permintaan pertama dari luar perl5-porter, jadi ini adalah aktivitas bandwidth yang cukup rendah. (Maaf itu bahkan lebih rendah minggu lalu - saya pergi di New York di Internet World.)

Bagaimanapun, sejauh yang saya ketahui, Anda mungkin memiliki 'P' dengan restu saya. (Jelas Perl tidak membutuhkan 'P' pada saat ini. :-) [...]

Jadi saya tidak tahu apa pilihan P yang asli dimotivasi oleh - pola? placeholder? penguin? - tapi Anda bisa mengerti mengapa saya selalu mengaitkannya dengan Python. Yang mempertimbangkan bahwa (1) Saya tidak suka ekspresi reguler dan menghindarinya sedapat mungkin, dan (2) utas ini terjadi lima belas tahun yang lalu, agak aneh.

DSM
sumber
4
"Ekstensi khusus-piton" mungkin?
jmort253
50
Wow, Anda memang menemukan beberapa data historis yang bagus dan relevan, di sini! Interpretasi saya terhadap posting Guido adalah "P" adalah singkatan dari "Python-specific extensions".
Eric O Lebigot
1
Yap, itu terlihat pasti bagi saya. Jadi ironis bahwa Perl dan PCRE awalnya menyalin sintaks, hanya karena Python adalah rasa pertama yang mendukung tangkapan bernama. Tetapi mereka juga mendukung (?<group_name>…)sintaks, yang tampaknya paling populer - bahkan Java mendukungnya sekarang.
Alan Moore
3
+1 Ini adalah salah satu jawaban canggung terbaik yang dipertahankan dengan baik :). Pada awalnya, saya pikir ini terlalu bodoh. Tetapi pada akhirnya, saya sepenuhnya setuju.
Sumudu
4
Saya suka bahwa bahkan pembuat Python menggunakan sintaksis aneh aneh ketika Perl terlibat, dan komunitas Perl benar-benar baik-baik saja dengan itu. Jika Anda mencoba menambahkan ekstensi / sintaks khusus Perl ke Python, akan ada darah di jalanan.
Keith Ripley
20

Pola! Grup memberi nama (sub) pola untuk digunakan nanti di regex. Lihat dokumentasi di sini untuk perincian tentang bagaimana kelompok tersebut digunakan.

Mike
sumber
3
+1: Ini adalah perangkat mnemonic yang baik: (?P<name>…)is "pattern name". Semuanya adalah sebuah pola, dalam regexp, jadi agak aneh jika hanya memberi label pada (?P<…>…)grup sebagai pola. Ini akan dilakukan, untuk siswa saya. :)
Eric O Lebigot
1
@ EOL tidak mengajarkan siswa hal-hal yang salah. Mereka lebih sulit dihilangkan ketika Anda mencapai ketepatan daripada yang Anda pikirkan. Misalnya. beberapa, bagi saya, membutuhkan beberapa tahun 5. Secara paradoks, dianjurkan untuk berbicara dengan santai, selalu sangat jelas dan eksplisit tentang hal itu - misalnya. ceritakan komentar Anda sebelumnya kepada siswa Anda (merevisi mungkin kalimat terakhir;).)
n611x007
5

Ekstensi Python. Dari Python Docos:

Solusi yang dipilih oleh pengembang Perl adalah menggunakan (? ...) sebagai sintaksis ekstensi. ? segera setelah tanda kurung adalah kesalahan sintaks karena? tidak perlu mengulangi, jadi ini tidak menimbulkan masalah kompatibilitas. Karakter segera setelah? menunjukkan ekstensi apa yang digunakan, jadi (? = foo) adalah satu hal (pernyataan lookahead positif) dan (?: foo) adalah sesuatu yang lain (grup yang tidak menangkap yang berisi subexpression foo).

Python mendukung beberapa ekstensi Perl dan menambahkan sintaks ekstensi ke sintaks ekstensi Perl. Jika karakter pertama setelah tanda tanya adalah P, Anda tahu bahwa itu adalah ekstensi yang khusus untuk Python

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

Beberapa pria
sumber
Terlihat dengan baik! Ini menegaskan perasaan DSM.
Eric O Lebigot