2017-07-22 29 views
5

Tôi muốn làm một cái gì đó (nhiều hơn là chỉ thay thế) với các chất nền phù hợp với một mẫu trong một chuỗi dài hơn. Nếu chuyển nhượng là một biểu thức trả về một giá trị, như trong C và hầu hết các ngôn ngữ lập trình khác, đây sẽ là (sử dụng cú pháp C với ngữ nghĩa Python):Trong Python, làm thế nào tôi có thể lặp qua tất cả các kết quả phù hợp của một biểu thức chính quy trên một chuỗi?

while (match = re.search(pat, str)) { 
     /* do something to the string, using the match object, 
      in addition to removing or replacing the substring 
     */ 
    } 

hoặc một cách chi tiết hơn, tránh việc sử dụng một bài tập như một biểu thức:

for (match = re.search(pat, str); 
     match; 
     match = re.search(pat, str)) { 
    /* do something to the string, using the match object */ 
} 

Ít nhất một trong các ngôn ngữ lập trình này là: C, C++, Java, Perl, Javascript, ... nhưng không có ngôn ngữ nào trong Python. Có một tương đương pythonic (không liên quan đến một mớ hỗn độn kludgey với một break hoặc tiếp tục tuyên bố)?

+2

Câu trả lời phụ thuộc. Bạn đang lặp lại điều gì? Có chắc chắn là không có một bản đồ, nhưng chắc chắn là tương đương pythonic. Nếu bạn có thể chính xác hơn một chút với những gì bạn muốn ... bởi vì khi nó đứng thì câu hỏi này quá rộng. –

Trả lời

4

Bạn có thể tìm kiếm finditer:

Return một iterator năng suất phù hợp với các đối tượng trên tất cả các trận đấu không chồng chéo cho các mẫu RE trong chuỗi. Chuỗi được quét từ trái sang phải và các kết quả khớp được trả về theo thứ tự tìm thấy. Các kết quả trống sẽ được bao gồm trong kết quả trừ khi chúng chạm vào đầu của một trận đấu khác.

#!/usr/bin/env python3 

import re 

s = "abcabcabc"; 
it = re.finditer("(\w)", s) 
for m in it: 
    print(m.groups()) 
$ ./t.py 
('a',) 
('b',) 
('c',) 
('a',) 
('b',) 
('c',) 
('a',) 
('b',) 
('c',) 
+0

Điều này chỉ quét chuỗi một lần, vì vậy nó sẽ không hoạt động trong trường hợp chung; hầu như bất kỳ thay đổi nào đối với chuỗi bên trong vòng lặp sẽ phá vỡ nó, ví dụ như thay thế mẫu phù hợp bằng một cái gì đó có độ dài khác. – zizzler

+0

Có lẽ bạn có thể đưa ra một ví dụ minh họa hành vi bạn muốn và hỏi cách thực hiện nó trong Python. Tôi không muốn chơi "đoán xem OP muốn gì". –

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