2012-04-08 34 views
98

Trong Python, các (?P<group_name>…)syntax cho phép một để tham khảo các chuỗi phù hợp thông qua tên của nó:Nhóm cụm từ thông dụng được đặt tên "(? P <group_name> regexp)": "P" là gì?

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

gì "P" đứng cho? Tôi không thể tìm thấy bất kỳ gợi ý nào trong số official documentation.

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

+3

'P' là viết tắt của' Trình giữ chỗ'. – kev

+0

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

+3

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

Trả lời

149

Vì tất cả chúng ta đều đoán, tôi cũng có thể cho tôi biết: Tôi luôn nghĩ nó phù hợp với Python. Điều đó nghe có vẻ khá ngu ngốc - cái gì, P cho Python ?! - nhưng trong phòng của tôi, tôi mơ hồ nhớ this thread [nhấn mạnh của tôi]:

Subject: Đòi tiền (? P ...) mở rộng cú pháp regex

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

ngày: ngày 10 tháng 12 1997 03:36:19

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-porters) là danh sách đúng. Tôi là cc'ing chuỗi Python-sig vì nó là nguồn gốc của hầu hết các công việc mà tôi đang thảo luận ở đây.

Có thể bạn đã biết về Python. Tôi là người tạo ra Python; Tôi đang lập kế hoạch phát hành phiên bản "chính" tiếp theo, Python 1.5, vào cuối trong 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 ở Python khi ông nói thêm đối tượng Perl 5;. O'Reilly xuất bản sách về cả hai ngôn ngữ)

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

(?P<foo>...) Tương tự như ngoặc nhóm thường xuyên, nhưng văn bản
kết hợp bởi nhóm là truy cập sau khi trận đấu đã được thực hiện, qua tên nhóm biểu tượng "foo".

(?P=foo) So khớp chuỗi tương tự như kết hợp bởi các nhóm có tên "foo". tương đương với \ 1, \ 2, vv trừ rằng nhóm được gọi
theo tên, không phải số.

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

mà Larry Wall trả lời:

[...] không có đăng ký như của bây giờ -. bạn là yêu cầu đầu tiên từ bên ngoài Perl5-khuân vác, vì vậy đó là một hoạt động khá thấp băng thông (Xin lỗi nó thậm chí còn thấp hơn week- cuối cùng -Tôi đã ở New York tại Internet Thế giới.)

Dù sao, theo như tôi quan tâm, bạn có thể chắc chắn có 'P' với phước lành 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ô hình là gì? trình 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. Mà xem xét rằng (1) Tôi không thích 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à loại lẻ.

+3

"Phần mở rộng Python cụ thể" có lẽ? – jmort253

+23

Chà, bạn đã tìm thấy một số dữ liệu lịch sử tốt và có liên quan, tại đây! Giải thích của tôi về bài viết của Guido là "P" là viết tắt của "phần mở rộng Python cụ thể". – EOL

+1

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

11

Mẫu! Nhóm này đặt tên (mẫu phụ) để sử dụng sau này trong regex. Xem the documentation here để biết chi tiết về cách sử dụng các nhóm này.

+3

+1: Đây là một thiết bị ghi nhớ tốt: '(? P …)' là "mẫu' tên' ". Tất cả mọi thứ là một mô hình, mặc dù, trong một regexp, do đó, nó là loại lạ để chỉ nhãn '(? P <…> ...)' nhóm như các mẫu. Điều này sẽ làm, mặc dù, cho các sinh viên của tôi. :) – EOL

+0

@EOL không dạy sinh viên những điều sai trái. Họ khó cắt đứt khi bạn đạt tới độ 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 của '5'. Nghịch lý, nó được khuyến khích để nói chuyện tình cờ, chỉ luôn luôn rất rõ ràng và rõ ràng về nó - ví dụ. nói cho bình luận trước của bạn đầy đủ thời gian cho các sinh viên của bạn (sửa đổi có lẽ câu cuối cùng;).) – n611x007

Các vấn đề liên quan