Python:如何计算子字符串的重叠出现次数

时间:2013-10-10 17:38:01

标签: python

我想计算像'aa'这样的字符串出现在'aaa'(或'aaaa')中的次数。

最明显的代码给出了错误的(或至少不是直观的)答案:

'aaa'.count('aa')
1 # should be 2
'aaaa'.count('aa')
2 # should be 3

有没有人有一个简单的方法来解决这个问题?

4 个答案:

答案 0 :(得分:10)

来自str.count()文档:

  

返回[start,end]范围内substring sub的非重叠事件的数量。可选参数start和end被解释为切片表示法。

所以,不。你得到了预期的结果。

如果您想计算重叠匹配的数量,请使用regex

>>> import re
>>> 
>>> len(re.findall(r'(a)(?=\1)', 'aaa'))
2

这会查找a的所有匹配项,后跟a。第二个a不会被捕获,因为我们使用了前瞻,这是零宽度断言。

答案 1 :(得分:6)

haystack = "aaaa"
needle   = "aa"

matches  = sum(haystack[i:i+len(needle)] == needle 
               for i in xrange(len(haystack)-len(needle)+1))

# for Python 3 use range instead of xrange

答案 2 :(得分:1)

解决方案没有考虑重叠。

试试这个:

big_string = "aaaa"
substring = "aaa"
count = 0 

for char in range(len(big_string)):
    count += big_string[char: char + len(subtring)] == substring

print count

答案 3 :(得分:0)

你必须要小心,因为你似乎在寻找不重叠的子串。为了解决这个问题,我会这样做:

len([s.start() for s in re.finditer('(?=aa)', 'aaa')])

如果您不关心子字符串开始的位置,您可以这样做:

len([_ for s in re.finditer('(?=aa)', 'aaa')])

虽然比我聪明的人可能能够证明存在表演差异:)