如果子串重叠,如何计算python中的子串数?

时间:2018-03-15 06:49:01

标签: python-3.x substring

count()函数返回字符串中出现子字符串的次数,但如果字符串重叠则会失败。

假设我的输入是:

^_^_^-_-

我想查找字符串中出现^_^次。

mystr=input()
happy=mystr.count('^_^')
sad=mystr.count('-_-')
print(happy)
print(sad)

输出是:

1
1

我期待:

2
1

如何达到预期效果?

3 个答案:

答案 0 :(得分:3)

新版本

您可以使用正则表达式编写任何显式循环来解决此问题。正如@abhijith-pk's answer巧妙地建议的那样,你可以只搜索第一个字符,其余部分放在一个正面的前瞻中,这样就可以与重叠进行匹配:

def count_overlapping(string, pattern):
    regex = '{}(?={})'.format(re.escape(pattern[:1]), re.escape(pattern[1:]))
    # Consume iterator, get count with minimal memory usage
    return sum(1 for _ in re.finditer(regex, string))

[IDEOne Link]

对索引使用[:1][1:]允许函数在没有特殊处理的情况下处理空字符串,而对索引使用[0][1:]则不会。 / p>

旧版

您可以使用str.find允许您指定起始索引的事实来编写自己的例程。这个例程效率不高,但应该有效:

def count_overlapping(string, pattern):
    count = 0
    start = -1
    while True:
        start = string.find(pattern, start + 1)
        if start < 0:
            return count
        count += 1

[IDEOne Link]

<强>用法

两个版本都返回相同的结果。示例用法是:

>>> mystr = '^_^_^-_-'
>>> count_overlapping(mystr, '^_^')
2
>>> count_overlapping(mystr, '-_-')
1
>>> count_overlapping(mystr, '')
9
>>> count_overlapping(mystr, 'x')
0

请注意,找到空字符串len(mystr) + 1次。我认为这是直观正确的,因为它实际上是在每个角色之间和周围。

答案 1 :(得分:3)

你可以使用正则表达式来快速而肮脏的解决方案:

import re
mystr='^_^_^-_-'
print(len(re.findall('\^(?=_\^)',mystr)))

答案 2 :(得分:1)

你需要这样的东西

def count_substr(string,substr):
    n=len(substr)
    count=0
    for i in range(len(string)-len(substr)+1):
        if(string[i:i+len(substr)] == substr):      
            count+=1
    return count

mystr=input()
print(count_substr(mystr,'121'))
  

输入:12121990

     

输出:2