กลุ่มนิพจน์ทั่วไปที่มีชื่อว่า“ (? P <group_name> regexp)”:“ P” หมายถึงอะไร


178

ใน Python (?P<group_name>…) ไวยากรณ์อนุญาตให้หนึ่งอ้างถึงสตริงที่ตรงกันผ่านชื่อ:

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

"P" หมายถึงอะไร ฉันไม่สามารถหาคำแนะนำใด ๆ ในเอกสารที่เป็นทางการ

ฉันชอบที่จะได้รับความคิดเกี่ยวกับวิธีการช่วยให้นักเรียนของฉันจำไวยากรณ์นี้ การรู้ว่า "P" นั้นหมายถึงอะไร (หรืออาจใช้แทน) จะมีประโยชน์


8
PPlaceholderย่อมาจาก
kev

1
@kev: ดูเหมือนว่าควรจะเป็นคำตอบ?
ninjagecko

3
เนื่องจากการเดามีความเหมาะสมฉันจึงคาดเดาว่า Ken Thompson เป็นผู้เห็นอกเห็นใจชาวฮิปปี้และ "P" ย่อมาจาก "Patchouli"
aaronasterling

2
คำถามนี้ถูกเพิ่มไปยังคำถามที่พบบ่อยของนิพจน์สแต็คล้นปกติภายใต้ "กลุ่ม"
aliteralmind

6
โดยวิธีการถ้าคุณใช้match.groups(กับs) คุณจะได้รับ tuple ของทุกกลุ่มอย่างเงียบ ๆ-_- groups('name')=> ('John', '123456')เมื่อสิ่งที่คุณต้องการคือ group('name')=> 'John' ฉันหวังว่าสิ่งนี้จะช่วยให้ใครซักคนอยู่ที่ไหนซักแห่งในบางครั้ง
szmoore

คำตอบ:


262

เนื่องจากเราทุกคนคาดเดาฉันก็อาจให้ของฉัน: ฉันคิดเสมอว่ามันเป็นของ Python นั่นอาจฟังดูงี่เง่า - อะไร P สำหรับ Python! - แต่ในการป้องกันของฉันฉันจำหัวข้อนี้ไม่ชัด[เหมืองเน้น]:

Subject: การอ้างสิทธิ์ (? P ... ) ส่วนขยายไวยากรณ์ของ regex

จาก: Guido van Rossum (gui ... @ CNRI.Reston.Va.US)

วันที่: 10 ธันวาคม 1997 3:36:19 น

ฉันมีคำขอที่ผิดปกติสำหรับนักพัฒนา Perl (ผู้ที่พัฒนาภาษา Perl) ฉันหวังว่านี่ (perl5-porter) เป็นรายชื่อที่ถูกต้อง ฉันกำลังอ่านสตริงไพ ธ อนเพราะมันคือต้นกำเนิดของงานส่วนใหญ่ที่ฉันกำลังพูดถึงอยู่ที่นี่

คุณอาจตระหนักถึง Python ฉันเป็นผู้สร้าง Python; ฉันวางแผนที่จะวางจำหน่ายรุ่น "หลัก" รุ่นต่อไปคือ Python 1.5 ภายในสิ้นปีนี้ ฉันหวังว่า Python และ Perl สามารถอยู่ร่วมกันได้ในไม่กี่ปีข้างหน้า การผสมเกสรข้ามสามารถทำได้ดีสำหรับทั้งสองภาษา (ฉันเชื่อว่า Larry ดู Python ได้ดีเมื่อเขาเพิ่มวัตถุลงใน Perl 5; O'Reilly ตีพิมพ์หนังสือเกี่ยวกับทั้งสองภาษา)

ดังที่คุณทราบ Python 1.5 เพิ่มโมดูลนิพจน์ทั่วไปใหม่ที่ตรงกับไวยากรณ์ของ Perl มากขึ้น เราพยายามที่จะใกล้เคียงกับไวยากรณ์ Perl มากที่สุดเท่าที่จะทำได้ภายในไวยากรณ์ของ Python อย่างไรก็ตามไวยากรณ์ regex มีส่วนขยายเฉพาะ Python บางส่วนซึ่งทั้งหมดเริ่มต้นด้วย (? P ขณะนี้มีสองส่วนต่อไปนี้:

(?P<foo>...)คล้ายกับวงเล็บการจัดกลุ่มปกติ แต่ข้อความที่
จับคู่โดยกลุ่มสามารถเข้าถึงได้หลังจากทำการจับคู่ผ่านชื่อกลุ่มสัญลักษณ์ "foo"

(?P=foo)จับคู่สตริงเดียวกันกับที่จับคู่โดยกลุ่มชื่อ "foo" เทียบเท่ากับ \ 1, \ 2 ฯลฯ ยกเว้นว่ากลุ่มถูกอ้าง
ถึงโดยใช้ชื่อไม่ใช่ตัวเลข

ฉันหวังว่าส่วนขยายเฉพาะ Python นี้จะไม่ขัดแย้งกับส่วนขยาย Perl ในอนาคตใด ๆ กับไวยากรณ์ Perl regex หากคุณมีแผนที่จะใช้ (? P โปรดแจ้งให้เราทราบโดยเร็วที่สุดเพื่อให้เราสามารถแก้ไขข้อขัดแย้งได้ มิฉะนั้นจะเป็นการดีถ้าหาก (? P ไวยากรณ์อาจถูกสงวนไว้เป็นการถาวรสำหรับส่วนขยายไวยากรณ์เฉพาะของ Python (คือ มีรีจิสตรีของส่วนขยายหรือไม่)

ซึ่ง Larry Wall ได้ตอบกลับ:

[... ] ไม่มีการลงทะเบียน ณ ตอนนี้ - คุณเป็นคำขอแรกจากภายนอก perl5-porter ดังนั้นจึงเป็นกิจกรรมที่มีแบนด์วิธต่ำ (ขออภัยที่ลดลงเมื่อสัปดาห์ที่แล้ว - ฉันอยู่ที่นิวยอร์กที่ Internet World)

อย่างไรก็ตามเท่าที่ฉันกังวลคุณอาจมี 'P' ด้วยพรของฉัน (เห็นได้ชัดว่า Perl ไม่ต้องการตัว 'P' ในตอนนี้ :-) [... ]

ดังนั้นฉันไม่รู้ว่าตัวเลือกเดิมของ P ได้รับแรงบันดาลใจจากรูปแบบอะไร ตัวยึด? เพนกวิน? - แต่คุณสามารถเข้าใจได้ว่าทำไมฉันถึงเชื่อมโยงกับ Python เสมอ ซึ่งพิจารณาว่า (1) ฉันไม่ชอบการแสดงออกปกติและหลีกเลี่ยงพวกเขาทุกที่ที่ทำได้และ (2) กระทู้นี้เกิดขึ้นเมื่อสิบห้าปีที่แล้วเป็นเรื่องแปลก


4
"ส่วนขยายเฉพาะงูหลาม" อาจจะ?
jmort253

50
ว้าวคุณพบข้อมูลทางประวัติศาสตร์ที่ดีและมีความเกี่ยวข้องที่นี่แล้ว! การตีความโพสต์ของกุยโด้ของฉันคือ "P" ย่อมาจาก "ส่วนขยายเฉพาะของ Python"
Eric O Lebigot

1
ใช่แล้วมันดูชัดเจนสำหรับฉัน ดังนั้นมันเป็นเรื่องน่าขันที่ Perl และ PCRE เริ่มคัดลอกไวยากรณ์เพียงเพราะ Python เป็นรสชาติแรกที่สนับสนุนการจับชื่อ แต่พวกเขายังสนับสนุน(?<group_name>…)ไวยากรณ์ซึ่งดูเหมือนว่าจะเป็นที่นิยมมากที่สุด - แม้แต่ Java ก็ยังรองรับ
Alan Moore

3
+1 นี่คือหนึ่งในคำตอบที่น่าอึดอัดใจที่ดีที่สุดที่ได้รับการปกป้องอย่างดี :) ตอนแรกฉันคิดว่ามันโง่เกินไป แต่ในที่สุดฉันก็เห็นด้วยทั้งหมด
Sumudu

4
ฉันชอบที่แม้กระทั่งผู้สร้างของ Python ก็ใช้ไวยากรณ์ที่แปลกประหลาดเมื่อ Perl มีส่วนเกี่ยวข้องและชุมชน Perl ก็ใช้ได้ดีด้วย หากคุณพยายามที่จะเพิ่มส่วนขยาย / ไวยากรณ์เฉพาะ Perl ไปยัง Python จะมีเลือดอยู่ตามท้องถนน
Keith Ripley

20

รูปแบบ! กลุ่มชื่อรูปแบบ (ย่อย) เพื่อใช้ในภายหลังใน regex ดูเอกสารประกอบที่นี่สำหรับรายละเอียดเกี่ยวกับวิธีการใช้กลุ่มดังกล่าว


3
+1: นี่เป็นอุปกรณ์ช่วยในการจำที่ดี: (?P<name>…)คือ "รูปแบบname" ทุกอย่างเป็นรูปแบบ แต่ใน regexp ดังนั้นมันจึงเป็นเรื่องแปลกที่(?P<…>…)กลุ่มป้ายกำกับเท่านั้นเป็นรูปแบบ แต่จะทำอย่างไรกับนักเรียนของฉัน :)
Eric O Lebigot

1
@EOL ไม่ได้สอนนักเรียนในเรื่องที่ผิด ๆ มันยากที่จะตัดออกเมื่อคุณไปถึงความแม่นยำมากกว่าที่คุณคิด เช่น. 5บางอย่างผมใช้เวลาหลายปีหลาย ขัดแย้งได้รับการสนับสนุนให้พูดอย่างตั้งใจเพียงแค่ชัดเจนและชัดเจนเกี่ยวกับเรื่องนี้เสมอ - เช่น บอกความคิดเห็นก่อนหน้าของคุณแก่นักเรียนของคุณ (แก้ไขประโยคสุดท้าย;).)
n611x007

5

Python ส่วนขยาย จาก Python Docos:

โซลูชันที่นักพัฒนา Perl เลือกใช้คือ (? ... ) เป็นไวยากรณ์ส่วนขยาย ? ทันทีหลังจากวงเล็บเป็นข้อผิดพลาดทางไวยากรณ์เพราะ? จะไม่มีอะไรทำซ้ำดังนั้นสิ่งนี้จึงไม่แนะนำปัญหาความเข้ากันได้ ตัวละครทันทีหลัง? ระบุว่ามีการใช้ส่วนขยายใดดังนั้น (? = foo) เป็นสิ่งหนึ่ง (การยืนยันแบบเชิงบวก lookahead) และ (?: foo) เป็นอย่างอื่น (กลุ่มที่ไม่ได้รวบรวมภาพที่มี subexpression foo)

Python สนับสนุนส่วนขยายของ Perl หลายรายการและเพิ่มไวยากรณ์ส่วนขยายให้กับไวยากรณ์ส่วนขยายของ Perl หากอักขระตัวแรกหลังเครื่องหมายคำถามคือ P คุณจะรู้ว่ามันเป็นส่วนขยายเฉพาะของ Python

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


เห็นดี! สิ่งนี้เป็นการยืนยันความรู้สึกของ DSM
Eric O Lebigot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.