2012-02-19 34 views
5

Ở đây nó là:Sự khác nhau giữa các nhóm và nhóm trong mô-đun tái là gì?

import re 
>>>s = 'abc -j k -l m' 
>>>m = re.search('-\w+ \w+', s) 
>>>m.groups() 
() 
>>> m.group(0) 
'-j k' 

Tại sao groups() mang lại cho tôi không có gì, nhưng group(0) mang lại một số? Sự khác biệt là gì?

Follow Up

Mã là như sau

>>>re.findall('(-\w+ \w+)', s) 
['-j k', '-l m', '-n o'] 

findall có thể làm cho tôi tất cả các -\w+ \w+ chuỗi con, nhưng xem xét điều này:

>>>m = re.search('(-\w+ \w+)+', s) 
>>>m.groups() 
('-j k',) 

Tại sao không thể search Hãy cho tôi tất cả các chất nền?

Follow Up Again

Nếu s = 'abc -j k -l m -k o

>>>m = re.search(r'(-\w+ \w+)+', s) 
>>>m.groups() 
('-l m ',)  # why just one substring? 
>>>m.group(0) 
'-j k -l m ' # as I expected 
+0

Hành vi tiêu chuẩn trong hầu hết các hương vị biểu thức chính quy là * thay thế * bất kỳ nội dung nào của nhóm khi nó được chụp nhiều lần thay vì tạo các nhóm phụ cho mỗi thẻ. Nếu bạn muốn chụp tất cả chúng, bạn sẽ phải tìm kiếm nhiều lần. 're.findall()' sẽ hữu ích trong trường hợp của bạn. – danielkza

+0

@danielkza, nhưng tại sao 'groups()' cho tôi ''-l m'' không ''-j k''? – Alcott

+1

Vượt qua đầu tiên của sự lặp lại khớp với '-j k'. Pass thứ hai sau đó ghi đè lên kết quả được lưu trữ với một cái mới, '-l m'. Nếu có nhiều trận đấu hơn sau, trận đấu cuối cùng sẽ là trận đấu được lưu trữ. Tôi không thể cho bạn biết * tại sao * hành vi này tồn tại, nhưng nó có mặt hầu như tất cả các hương vị biểu hiện chính quy. Nếu bạn muốn nắm bắt tất cả các trận đấu, bạn phải áp dụng mẫu nhiều lần. – danielkza

Trả lời

11

groups() chỉ trả bất kỳ nhóm rõ ràng-bị bắt trong regex của bạn (biểu thị bằng ( dấu ngoặc tròn ) trong regex của bạn), trong khi group(0) lợi nhuận toàn bộ chuỗi con phù hợp với regex của bạn bất kể biểu thức của bạn có bất kỳ nhóm chụp nào hay không.

Ảnh chụp rõ ràng đầu tiên trong regex của bạn được chỉ báo bằng cách group(1) thay thế.

Re theo dõi chỉnh sửa:

Tại sao không thể search cho tôi tất cả các chuỗi con?

search() sẽ chỉ trả về kết quả trùng khớp đầu tiên với mẫu trong chuỗi đầu vào của bạn.

+0

Chỉnh sửa bài đăng gốc. – Alcott

+0

@Alcott: Tôi đã thêm một câu trả lời tiếp theo. – BoltClock

+0

Hehe. "dấu ngoặc tròn". –

1

Regex của bạn không có nhóm đối sánh nào, được chỉ định bằng số trang ((...)).

2

Hãy để tôi giải thích với một ví dụ nhỏ

>>> var2 = "Welcome 44 72" 
>>> match = re.search(r'Welcome (\d+) (\d+)',var2) 
>>> match.groups() 
('44', '72') 
>>> match.groups(0) 
('44', '72') 
>>> match.groups(1) 
('44', '72') 
>>> match.group(0) 
'Welcome 44 72' 
>>> match.group(1) 
'44' 

Giải thích: groups() là một loại tuple trong đó có tất cả các giá trị đó là mô hình phù hợp với biểu hiện thường xuyên của bạn.

groups(0) hoặc groups() hoặc groups(1) .... Nó chỉ in tất cả các giá trị

nhóm() hoặc nhóm (0) -> Nó sẽ cung cấp cho toàn bộ chuỗi cùng với giá trị đó là mô hình phù hợp với biểu hiện thường xuyên của bạn .

nhóm (1) sẽ cung cấp giá trị được đối sánh mẫu đầu tiên

nhóm (2) sẽ cung cấp giá trị khớp mẫu thứ hai ....

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