Các giải pháp hiện tại dựa trên findall
cũng tốt cho trận đấu không chồng chéo (và không có nghi ngờ tối ưu trừ có thể cho số lượng lớn các trận đấu), mặc dù lựa chọn thay thế như sum(1 for m in re.finditer(thepattern, thestring))
(để tránh bao giờ thực hiện danh sách khi tất cả các bạn quan tâm là đếm) cũng khá tốt. Hơi mang phong cách riêng sẽ được sử dụng subn
và bỏ qua chuỗi kết quả ...:
def countnonoverlappingrematches(pattern, thestring):
return re.subn(pattern, '', thestring)[1]
lợi thế thực duy nhất của ý tưởng sau này sẽ đến nếu bạn chỉ quan tâm để đếm (nói) lên đến 100 trận đấu; sau đó, re.subn(pattern, '', thestring, 100)[1]
có thể thực tế (trả lại 100 cho dù có 100 kết quả phù hợp hoặc 1000 hoặc thậm chí là số lớn hơn).
Đếm chồng chéo kết quả phù hợp yêu cầu bạn viết nhiều mã hơn, bởi vì các hàm tích hợp được đề cập đều tập trung vào các kết quả trùng lặp không trùng lặp. Ngoài ra còn có vấn đề về định nghĩa, ví dụ: với mẫu là 'a+'
và tham gia là 'aa'
, bạn có cho rằng đây chỉ là một kết quả phù hợp hay ba (số a
đầu tiên, thứ hai, cả hai) hoặc ...?
Giả sử ví dụ mà bạn muốn có thể chồng chéo trận bắt đầu tại các điểm khác nhau trong chuỗi (mà sau đó sẽ cung cấp cho HAI trận ví dụ như trong đoạn trước):
def countoverlappingdistinct(pattern, thestring):
total = 0
start = 0
there = re.compile(pattern)
while True:
mo = there.search(thestring, start)
if mo is None: return total
total += 1
start = 1 + mo.start()
Lưu ý rằng bạn làm phải biên dịch mẫu thành đối tượng RE trong trường hợp này: hàm re.search
không chấp nhận đối số start
(vị trí bắt đầu cho tìm kiếm) theo cách phương thứcsearch
, vì vậy bạn phải cắt bớt lời khi bạn đi - chắc chắn nhiều nỗ lực hơn là chỉ tìm kiếm tiếp theo tart tại điểm bắt đầu có thể khác biệt tiếp theo, đó là những gì tôi đang làm trong chức năng này.
Nguồn
2009-09-03 17:43:59
Bạn có cần tính các kết quả trùng lặp không? Là regex "bạn của một người bạn" một hoặc hai lần trong chuỗi "bạn của một người bạn của một người bạn"? –
Tôi cần chồng chéo. – Dan
Bạn cần chồng chéo? Vì vậy, nếu mẫu khớp là "aa" và chuỗi nguồn là "aaaa" thì câu trả lời đúng là 3? – steveha