Làm cách nào tôi có thể tìm thấy tất cả các kết quả khớp với biểu thức chính quy trong Python?


312

Trong một chương trình tôi đang viết Tôi có Python sử dụng re.search()hàm để tìm các kết quả khớp trong một khối văn bản và in kết quả. Tuy nhiên, chương trình sẽ thoát khi tìm thấy kết quả khớp đầu tiên trong khối văn bản.

Làm thế nào để tôi làm điều này nhiều lần khi chương trình không dừng lại cho đến khi TẤT CẢ các trận đấu được tìm thấy? Có một chức năng riêng biệt để làm điều này?


REs đệ quy là một con thú khác nhau. Bạn muốn lặp lại tìm kiếm.
outis

Câu trả lời:


545

Sử dụng re.findallhoặc re.finditerthay thế.

re.findall(pattern, string) trả về một danh sách các chuỗi phù hợp.

re.finditer(pattern, string)trả về một iterator trên MatchObjectcác đối tượng.

Thí dụ:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']

18
finditerlà những gì tôi đang tìm kiếm. Tôi ngạc nhiên khi một trả về các đối tượng Match và các chuỗi khác. Tôi đã mong đợi để sử dụng một match_allhoặc match_iterchức năng.
dsclose 7/12/2015

21
TUYÊN BỐ TỪ CHỐI: những người sẽ chỉ tìm thấy các trận đấu không chồng chéo
Antoine Lizée

3
@ AntoineLizée, làm thế nào để tìm thấy sự lặp lại với sự trùng lặp?
Raksha

16
@Raksha - Sử dụng re.searchtrong một vòng lặp. Nó sẽ trả về một Matchđối tượng. Bạn sẽ muốn truyền vào Match.start() + 1làm posđối số cho re.searchlần lặp tiếp theo của vòng lặp.
ArtOfWarfare

3
Nếu trận đấu chứa nhiều nhóm, findallsẽ trả về một danh sách các bộ dữ liệu khớp, không phải là danh sách các chuỗi khớp.
Rodorgas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.