首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Python找出字符串中重叠序列的个数?

如何用Python找出字符串中重叠序列的个数?
EN

Stack Overflow用户
提问于 2011-07-27 20:07:04
回答 4查看 8.6K关注 0票数 6

我有一个很长的序列,我想知道一些子序列在这个序列中出现的频率。

我知道string.count(s, sub),但它只计算不重叠的序列。

是否存在同样计算重叠序列的类似函数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-27 21:03:39

作为编写自己的搜索函数的替代方法,您可以使用re模块:

代码语言:javascript
复制
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]

上面打印出所有(可能重叠的)匹配的起始位置。

如果您所需要的只是计数,那么下面的代码应该可以解决这个问题:

代码语言:javascript
复制
In [27]: len(re.findall(r'(?=(%s))' % re.escape(needle), haystack))
Out[27]: 5
票数 10
EN

Stack Overflow用户

发布于 2011-07-27 20:54:08

一种简单易懂的方法是:

代码语言:javascript
复制
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

如果您喜欢简短的代码片段,您可以使其可读性较差,但更智能:

代码语言:javascript
复制
def count(subs, s):
    return sum((s[i:].startswith(subs) for i in xrange(len(s))))

这利用了Python可以像对待整数一样对待布尔值的事实。

票数 6
EN

Stack Overflow用户

发布于 2011-07-27 20:21:33

这应该会对你有所帮助:

代码语言:javascript
复制
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

没有对长字符串进行基准测试,看看它是否足够有效来供您使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6844005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档