字符串计数与重叠出现
在Python中,怎么才能数出一个字符串出现了多少次,包括重叠的部分呢?这里有一种方法:
def function(string, str_to_search_for):
count = 0
for x in xrange(len(string) - len(str_to_search_for) + 1):
if string[x:x+len(str_to_search_for)] == str_to_search_for:
count += 1
return count
function('1011101111','11')
这个方法会返回5。
在Python中有没有更好的方法呢?
25 个回答
23
你也可以试试这个新的 Python 正则表达式模块,它支持重叠匹配。
import regex as re
def count_overlapping(text, search_for):
return len(re.findall(search_for, text, overlapped=True))
count_overlapping('1011101111','11') # 5
57
>>> import re
>>> text = '1011101111'
>>> len(re.findall('(?=11)', text))
5
如果你不想把所有的匹配结果一次性加载到内存中,这其实并不是个问题!如果你真的想这么做,可以这样:
>>> sum(1 for _ in re.finditer('(?=11)', text))
5
作为一个函数(re.escape
可以确保子字符串不会干扰正则表达式):
def occurrences(text, sub):
return len(re.findall('(?={0})'.format(re.escape(sub)), text))
>>> occurrences(text, '11')
5
95
好吧,这个可能会更快,因为它是在C语言中进行比较的:
def occurrences(string, sub):
count = start = 0
while True:
start = string.find(sub, start) + 1
if start > 0:
count+=1
else:
return count