2010-04-24 32 views
23

Trong đoạn mã của tôi bên dưới, nhóm không bắt giữ "(?:aaa)" phải được bỏ qua trong kết quả phù hợp, do đó kết quả chỉ nên là "_bbb".
Tuy nhiên, tôi nhận được "aaa_bbb" trong kết quả phù hợp; chỉ khi tôi chỉ định nhóm (2), nó hiển thị "_bbb".Tại sao nhóm "không bắt giữ" biểu thức chính quy không hoạt động

import re 

string1 = "aaa_bbb" 
print(re.match(r"(?:aaa)(_bbb)", string1).group()) 

>>> aaa_bbb 
+1

tuyệt vời, cảm ơn bạn đã chỉnh sửa và trả lời chỉ ra khái niệm về nhóm không bắt giữ –

Trả lời

25

group()group(0) sẽ trả lại toàn bộ trận đấu. Các nhóm tiếp theo là các nhóm nắm bắt thực tế.

>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0)) 
aaa_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1)) 
_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
IndexError: no such group 
1

Hãy thử:

print(re.match(r"(?:aaa)(_bbb)", string1).group(1)) 

group() là giống như group(0) Tập đoàn 0 luôn luôn hiện diện và đó là toàn RE trận đấu.

2

TFM:

class re.MatchObject

group([group1, ...])

Returns một hoặc nhiều phân nhóm của trận đấu. Nếu có một đối số, kết quả là một chuỗi đơn; nếu có nhiều đối số, kết quả là một bộ tuple với một mục cho mỗi đối số. Không có đối số, nhóm1 mặc định là 0 (toàn bộ kết quả được trả về). Nếu một đối số nhóm là số không, giá trị trả về tương ứng là toàn bộ chuỗi phù hợp.

0

Bạn phải chỉ định group(1) để chỉ lấy một phần được ghi bởi dấu ngoặc đơn (_bbb trong trường hợp này).

group() không có tham số sẽ trả lại toàn bộ chuỗi biểu thức chính quy hoàn chỉnh phù hợp, bất kể một số phần của nó có được thêm dấu ngoặc đơn hay không.

+0

nhờ giải thích chi tiết :) –

55

Tôi nghĩ bạn hiểu nhầm khái niệm "nhóm không bắt giữ". Văn bản được so khớp bởi nhóm không bắt giữ vẫn trở thành một phần của kết hợp regex tổng thể.

Cả regex (?:aaa)(_bbb) và regex (aaa)(_bbb) trả lại aaa_bbb làm đối sánh chung. Sự khác biệt là regex đầu tiên có một nhóm chụp trả về _bbb làm đối sánh của nó, trong khi regex thứ hai có hai nhóm chụp trả lại aaa_bbb làm các kết quả phù hợp tương ứng. Trong mã Python của bạn, để có được _bbb, bạn cần sử dụng group(1) với regex đầu tiên và group(2) với regex thứ hai.

Lợi ích chính của nhóm không chụp là bạn có thể thêm chúng vào regex mà không làm xáo trộn số lượng nhóm chụp trong regex. Họ cũng cung cấp (hơi) hiệu suất tốt hơn như động cơ regex không phải theo dõi các văn bản phù hợp bởi các nhóm không bắt.

Nếu bạn thực sự muốn loại trừ aaa khỏi kết hợp regex chung thì bạn cần sử dụng lookaround. Trong trường hợp này, lookbehind tích cực hiện các trick: (?<=aaa)_bbb. Với regex này, group() trả lại _bbb bằng Python. Không cần nhóm chụp.

Đề xuất của tôi là nếu bạn có khả năng sử dụng các nhóm chụp để tham gia vào trận đấu regex, hãy sử dụng phương pháp đó thay vì xem xét kỹ.

+3

Đây là câu trả lời hữu ích hơn nhiều so với việc chấp nhận. – drstevok

0

Sử dụng phương pháp nhóm trên đối tượng đối sánh thay vì nhóm. Nó trả về một danh sách tất cả các bộ đệm chụp. Phương thức nhóm không có đối số là trả về toàn bộ kết hợp của cụm từ thông dụng.

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