Được đặt tên là nhóm biểu thức chính quy (? P <group_name> regapi) phạm lỗi: không có nghĩa là gì?


178

Trong Python, (?P<group_name>…) cú pháp cho phép một người tham chiếu đến chuỗi phù hợp thông qua tên của nó:

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

"P" có nghĩa là gì? Tôi không thể tìm thấy bất kỳ gợi ý trong tài liệu chính thức .

Tôi rất thích có được ý tưởng về cách giúp học sinh của tôi nhớ cú pháp này. Biết chữ "P" có nghĩa là gì (hoặc có thể đại diện cho) sẽ hữu ích.


8
Plà viết tắt của Placeholder.
kev

1
@kev: có vẻ như đó là một câu trả lời?
ninjagecko

3
Vì các phỏng đoán là phù hợp, tôi phỏng đoán rằng Ken Thompson là một người đồng cảm với hippie và chữ "P" là "Patchouli".
aaronasterling

2
Câu hỏi này đã được thêm vào Câu hỏi thường gặp về Biểu thức thường xuyên chồng chéo , trong phần "Nhóm".
aliteralmind

6
Nhân tiện, nếu bạn sử dụng match.groups(với một s), bạn sẽ âm thầm nhận được một tuple của tất cả các nhóm -_- groups('name')=> ('John', '123456')khi những gì bạn thực sự muốn là group('name')=> 'John' Tôi hy vọng điều này sẽ cứu ai đó ở đâu đó một thời gian.
szmoore

Câu trả lời:


262

Vì tất cả chúng ta đều đoán, tôi cũng có thể đưa ra ý kiến ​​của mình: Tôi luôn nghĩ nó là viết tắt của Python. Điều đó nghe có vẻ khá ngu ngốc - cái gì, P cho Python?! - nhưng trong sự bảo vệ của tôi, tôi mơ hồ nhớ chủ đề này [nhấn mạnh của tôi]:

Chủ đề: Yêu cầu mở rộng cú pháp regex (? P ...)

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

Ngày: 10 tháng 12 năm 1997 3:36:19 chiều

Tôi có một yêu cầu bất thường đối với các nhà phát triển Perl (những người phát triển ngôn ngữ Perl). Tôi hy vọng điều này (perl5-porter) là danh sách đúng. Tôi đang sử dụng chuỗi Python-sig vì nó là nguồn gốc của hầu hết các công việc tôi đang thảo luận ở đây.

Bạn có thể biết về Python. Tôi là người tạo ra Python; Tôi đang lên kế hoạch phát hành phiên bản "chính" tiếp theo, Python 1.5, vào cuối năm nay. Tôi hy vọng rằng Python và Perl có thể cùng tồn tại trong những năm tới; thụ phấn chéo có thể tốt cho cả hai ngôn ngữ. (Tôi tin rằng Larry đã có một cái nhìn tốt về Python khi anh ấy thêm các đối tượng vào Perl 5; O'Reilly xuất bản sách về cả hai ngôn ngữ.)

Như bạn có thể biết, Python 1.5 thêm một mô-đun biểu thức chính quy mới phù hợp hơn với cú pháp của Perl. Chúng tôi đã cố gắng gần với cú pháp Perl nhất có thể trong cú pháp của Python. Tuy nhiên, cú pháp regex có một số phần mở rộng dành riêng cho Python, tất cả đều bắt đầu bằng (? P. Hiện tại có hai trong số chúng:

(?P<foo>...)Tương tự như dấu ngoặc đơn nhóm thông thường, nhưng văn bản
phù hợp với nhóm có thể truy cập được sau khi trận đấu được thực hiện, thông qua tên nhóm tượng trưng "foo".

(?P=foo)Khớp chuỗi giống với chuỗi được khớp bởi nhóm có tên "foo". Tương đương với \ 1, \ 2, v.v. ngoại trừ nhóm được gọi
bằng tên, không phải số.

Tôi hy vọng rằng tiện ích mở rộng dành riêng cho Python này sẽ không xung đột với bất kỳ tiện ích mở rộng Perl nào trong tương lai với cú pháp biểu thức chính quy Perl. Nếu bạn có kế hoạch để sử dụng (? P, xin vui lòng cho chúng tôi biết càng sớm càng tốt để chúng ta có thể giải quyết mâu thuẫn. Nếu không, nó sẽ được tốt đẹp nếu (? Cú pháp P có thể được dành vĩnh viễn cho các phần mở rộng cú pháp Python cụ thể. (Is có một số loại đăng ký của phần mở rộng?)

mà Larry Wall đã trả lời:

[...] Hiện tại không có đăng ký - yêu cầu của bạn là yêu cầu đầu tiên từ bên ngoài perl5-porter, do đó, đây là một hoạt động băng thông khá thấp. (Xin lỗi, nó thậm chí còn thấp hơn vào tuần trước - Tôi đã nghỉ ở New York tại Thế giới Internet.)

Dù sao, theo như tôi quan tâm, bạn chắc chắn có thể có 'P' với lời chúc phúc của tôi. (Rõ ràng Perl không cần 'P' tại thời điểm này. :-) [...]

Vì vậy, tôi không biết lựa chọn ban đầu của P được thúc đẩy bởi - mẫu nào? giữ chỗ? chim cánh cụt? - nhưng bạn có thể hiểu tại sao tôi luôn liên kết nó với Python. Việc xem xét rằng (1) tôi không thích các biểu thức thông thường và tránh chúng ở bất cứ nơi nào có thể, và (2) chủ đề này đã xảy ra mười lăm năm trước, là một điều kỳ quặc.


4
"Phần mở rộng dành riêng cho Python" có lẽ?
jmort253

50
Wow, bạn đã tìm thấy một số dữ liệu lịch sử tốt và có liên quan, ở đây! Giải thích của tôi về bài đăng của Guido là "P" là viết tắt của "tiện ích mở rộng dành riêng cho Python".
Eric O Lebigot

1
Đúng, điều đó có vẻ dứt khoát với tôi. Vì vậy, thật mỉa mai khi Perl và PCRE ban đầu sao chép cú pháp, chỉ vì Python là hương vị đầu tiên hỗ trợ các ảnh chụp có tên. Nhưng họ cũng hỗ trợ (?<group_name>…)cú pháp, dường như là phổ biến nhất - ngay cả Java cũng hỗ trợ nó.
Alan Moore

3
+1 Đây là một trong những câu trả lời khó xử tốt nhất được bảo vệ tốt :). Lúc đầu, tôi nghĩ điều này quá ngu ngốc. Nhưng cuối cùng, tôi hoàn toàn đồng ý.
Sumudu

4
Tôi thích rằng ngay cả người tạo ra Python cũng sử dụng cú pháp phức tạp kỳ quái khi Perl có liên quan và cộng đồng Perl hoàn toàn ổn với điều đó. Nếu bạn đã cố gắng thêm các tiện ích mở rộng / cú pháp cụ thể của Perl vào Python, sẽ có máu trên đường phố.
Keith Ripley

20

Mẫu! Nhóm đặt tên cho mẫu (phụ) để sử dụng sau này trong biểu thức chính quy. Xem tài liệu ở đây để biết chi tiết về cách các nhóm như vậy được sử dụng.


3
+1: Đây là một thiết bị ghi nhớ tốt: (?P<name>…)là "mẫu name". Tất cả mọi thứ là một mẫu, mặc dù, trong một biểu thức chính quy, do đó, thật lạ khi chỉ (?P<…>…)các nhóm nhãn là mẫu. Điều này sẽ làm, mặc dù, cho các sinh viên của tôi. :)
Eric O Lebigot

1
@EOL không dạy học sinh những điều sai. Chúng khó bị băm nát hơn khi bạn đạt được độ chính xác hơn bạn nghĩ. Ví dụ. một số, đối với tôi, mất nhiều năm 5. Nghịch lý thay, nó được khuyến khích để nói một cách tình cờ, chỉ luôn luôn rất rõ ràng và rõ ràng về nó - ví dụ. nói với bình luận trước đó của bạn đầy đủ cho học sinh của bạn (sửa đổi có lẽ là câu cuối cùng;).)
n611x007

5

Tiện ích mở rộng Python. Từ tài liệu Python:

Giải pháp được các nhà phát triển Perl chọn là sử dụng (? ...) làm cú pháp mở rộng. ? ngay sau dấu ngoặc đơn là lỗi cú pháp vì? sẽ không có gì để lặp lại, vì vậy điều này đã không đưa ra bất kỳ vấn đề tương thích nào. Các nhân vật ngay sau khi? cho biết phần mở rộng nào đang được sử dụng, vì vậy (? = foo) là một thứ (một khẳng định nhìn tích cực) và (?: foo) là một cái gì đó khác (một nhóm không bắt giữ có chứa foo phụ thuộc).

Python hỗ trợ một số tiện ích mở rộng của Perl và thêm cú pháp mở rộng vào cú pháp mở rộng của Perl. Nếu ký tự đầu tiên sau dấu chấm hỏi là P, bạn biết rằng đó là phần mở rộng dành riêng cho Python

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


Cũng phát hiện ra! Điều này khẳng định cảm giác của DSM.
Eric O Lebigot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.