我有一个很长的序列,我想知道一些子序列在这个序列中出现的频率。
我知道string.count(s, sub),但它只计算不重叠的序列。
是否存在同样计算重叠序列的类似函数?
发布于 2011-07-27 21:03:39
作为编写自己的搜索函数的替代方法,您可以使用re模块:
In [22]: import re
In [23]: haystack = 'abababa baba alibababa'
In [24]: needle = 'baba'
In [25]: matches = re.finditer(r'(?=(%s))' % re.escape(needle), haystack)
In [26]: print [m.start(1) for m in matches]
[1, 3, 8, 16, 18]上面打印出所有(可能重叠的)匹配的起始位置。
如果您所需要的只是计数,那么下面的代码应该可以解决这个问题:
In [27]: len(re.findall(r'(?=(%s))' % re.escape(needle), haystack))
Out[27]: 5发布于 2011-07-27 20:54:08
一种简单易懂的方法是:
def count(sub, string):
count = 0
for i in xrange(len(string)):
if string[i:].startswith(sub):
count += 1
return count
count('baba', 'abababa baba alibababa')
#output: 5如果您喜欢简短的代码片段,您可以使其可读性较差,但更智能:
def count(subs, s):
return sum((s[i:].startswith(subs) for i in xrange(len(s))))这利用了Python可以像对待整数一样对待布尔值的事实。
发布于 2011-07-27 20:21:33
这应该会对你有所帮助:
matches =[]
st = 'abababa baba alibababa'
needle = 'baba'
for i in xrange(len(st)-len(needle)+1):
i = st.find(needle,i,i+len(needle))
if(i >= 0):
matches.append(st.find(needle,i,i+len(needle)))
print(str(matches))点击这里查看:http://codepad.org/pmkKXmWB
没有对长字符串进行基准测试,看看它是否足够有效来供您使用。
https://stackoverflow.com/questions/6844005
复制相似问题