我需要计算子串'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后结束。
然而,当我运行程序时程序结果是无限循环。
答案 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