2012-01-25 31 views
10

Đối với trường, tôi phải viết kịch bản lệnh Python RE để trích xuất địa chỉ IP. Cụm từ thông dụng tôi đang sử dụng dường như hoạt động với re.search() nhưng không hoạt động với re.findall().Cụm từ thông dụng của Python - re.search() vs re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
match = re.search(exp, ip) 
print match.group() 

Trận đấu cho điều đó luôn luôn là 192.168.0.185, nhưng nó khác nhau khi tôi làm re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
matches = re.findall(exp, ip) 
print matches[0] 

0. 

Tôi đang tự hỏi tại sao re.findall() sản lượng 0. khi re.search() mang 192.168.0.185, kể từ khi tôi m sử dụng cùng một biểu thức cho cả hai hàm.

Và tôi có thể làm gì để làm cho nó như vậy re.findall() thực sự sẽ theo đúng biểu thức? Hay tôi đang phạm sai lầm nào đó?

Trả lời

12

findall trả về một danh sách các trận đấu, và từ các tài liệu:

Nếu một hoặc nhiều nhóm có mặt trong mô hình, trả về một danh sách của nhóm; đây sẽ là danh sách các bộ dữ liệu nếu mẫu có nhiều nhóm.

Vì vậy, biểu hiện trước đó của bạn có một nhóm tương xứng với 3 lần trong chuỗi nơi trận đấu cuối cùng là 0.

Để khắc phục vấn đề của bạn sử dụng: exp = "(?:\d{1,3}\.){3}\d{1,3}"; bằng cách sử dụng phiên bản không nhóm, không có nhóm được trả lại nào để trận đấu được trả lại trong cả hai trường hợp.

+0

Điều đó hoạt động tốt, cảm ơn bạn. – user1168906

3

Bạn chỉ đang ghi số 0 trong regex đó, vì đó sẽ là lần cuối cùng bị bắt.

Thay đổi biểu thức để nắm bắt được toàn bộ IP, và phần lặp đi lặp lại là một tổ chức phi chụp nhóm:

In [2]: ip = "blah blah 192.168.0.185 blah blah" 

In [3]: exp = "((?:\d{1,3}\.){3}\d{1,3})" 

In [4]: m = re.findall(exp, ip) 

In [5]: m 
Out[5]: ['192.168.0.185'] 

In [6]: 

Và nếu nó giúp giải thích các regex:

In [6]: re.compile(exp, re.DEBUG) 
subpattern 1 
    max_repeat 3 3 
    subpattern None 
     max_repeat 1 3 
     in 
      category category_digit 
     literal 46 
    max_repeat 1 3 
    in 
     category category_digit 

này giải thích các mẫu con. Subpattern 1 là những gì bị bắt bởi findall.

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