字符串中子字符串的出现次数

时间:2013-11-07 22:51:57

标签: python python-2.7 substring

我需要计算子串'bob'出现在字符串中的次数。

示例问题:查找字符串s中出现'bob'的次数

"s = xyzbobxyzbobxyzbob"  #(here there are three occurrences)

这是我的代码:

s = "xyzbobxyzbobxyzbob"

numBobs = 0

while(s.find('bob') >= 0)
   numBobs = numBobs + 1
   print numBobs

由于Python中的find函数应该返回-1,如果子字符串未被触发,while循环应该在每次找到子字符串时打印出增加数量的bobs后结束。

然而,当我运行程序时程序结果是无限循环。

6 个答案:

答案 0 :(得分:7)

对于这项工作,str.find效率不高。相反,str.count应该是您使用的:

>>> s = 'xyzbobxyzbobxyzbob'
>>> s.count('bob')
3
>>> s.count('xy')
3
>>> s.count('bobxyz')
2
>>>

或者,如果您想要重叠发生,可以使用Regex:

>>> from re import findall
>>> s = 'bobobob'
>>> len(findall('(?=bob)', s))
3
>>> s = "bobob"
>>> len(findall('(?=bob)', s))
2
>>>

答案 1 :(得分:1)

当您从s.find('bob')开始搜索时,您最终会一次又一次地找到相同的bob,您需要将搜索位置更改为找到的bob的结尾。

string.find接受启动参数,你可以通过它来告诉它从哪里开始搜索,string.find也返回它找到的位置bob,所以你可以使用它,添加bob的长度到并将其传递给下一个s.find

因此,在循环集start=0开始时,如果要从开始搜索内部循环,如果find返回非负数,则应将搜索字符串的长度添加到其中以获得新的开始:

srch = 'bob'
start = numBobs = 0 while start >= 0:
    pos = s.find(srch, start)
    if pos < 0:
      break
    numBobs += 1
    start = pos + len(srch)

这里我假设不考虑重叠的搜索字符串

答案 2 :(得分:0)

find不记得上次比赛的位置并从那里开始,除非你告诉它。您需要跟踪匹配位置并传入可选的start参数。如果您不find,只会发现第一个bob一遍又一遍。

find(...)
    S.find(sub [,start [,end]]) -> int

    Return the lowest index in S where substring sub is found,
    such that sub is contained within s[start:end].  Optional
    arguments start and end are interpreted as in slice notation.

    Return -1 on failure.

答案 3 :(得分:0)

这是一个在不使用Regex的情况下返回重叠子字符串数量的解决方案: (注意:这里的&#39; while&#39;循环是在假设您正在寻找一个3字符的子字符串,即&#39; bob&#39;)

bobs = 0
start = 0
end = 3
while end <= len(s) + 1 and start < len(s)-2 :
    if s.count('bob', start,end) == 1:
        bobs += 1
    start += 1
    end += 1

print(bobs)

答案 4 :(得分:0)

这里有一个简单的任务功能:

def countBob(s):
number=0
while s.find('Bob')>0:
    s=s.replace('Bob','',1)
    number=number+1        
return number

然后,无论何时需要,都会问countBob:

countBob('This Bob runs faster than the other Bob dude!')

答案 5 :(得分:0)

def count_substring(string, sub_string):
count=a=0
while True:
    a=string.find(sub_string)
    string=string[a+1:]
    if a>=0:
        count=count+1;
    else:
        break
return count