好的,这是我的问题,我定义了一个函数,它假设计算某个字符串中出现某个片段的次数。该函数开始在Index [0]处搜索,随后的搜索从字符串中最后一个匹配的索引开始。
这是代码
def function(fragment, string):
count = -1
last_match = 0
while last_match != -1:
count += 1
last_match = string.find(fragment, last_match)
return count
现在问题是,当将参数传递给函数时,片段显然是字符串中的匹配,我得到一个无限循环。 当我修复无限循环时,如果位于Index [0]的传递片段函数没有返回正确的计数???
例如:
function('gtg' , 'gttacgtggatg' ) This gives me an infinite loop
function('gtt' , 'gttacgtggatg' ) This doesn't return a count..
只是寻求帮助和输入..
由于
答案 0 :(得分:4)
如果可能,您应该使用现有功能:
"aabbccaabb".count("aa")
count
方法完全符合您的要求。上面的例子返回2。
答案 1 :(得分:1)
你有两个错误:
所以你可能不得不使用它:
def function(fragment, string):
count = -1
last_match = 0
while last_match != -1:
count += 1
last_match = string.find(fragment, last_match)
if last_match != -1:
last_match += 1
return count
>>> function('gtt' , 'gttacgtggatg' )
1
>>> function('gtg' , 'gttacgtggatg' )
1
当然你也可以依赖string.count(片段),如果你对重叠匹配不感兴趣......或者正如以前的答案所提到的正则表达式......
>>> 'gttacgtggatg'.count('ctt')
0
>>> 'gttacgtggatg'.count('gtt')
1
答案 2 :(得分:0)
你考虑过使用正则表达式吗?它非常适合您的使用。 Python re module
更新:要扩展它,如果你做这样的事情......
导入重新
...
def countOccurrences(myFragment,myString): expr = re.compile(myFragment) return len(expr.findall(myString))
答案 3 :(得分:0)
从逻辑上讲,你的问题是你只是一遍又一遍地找到同一场比赛:
last_match = string.find(fragment, last_match)
...将从你找到最后一场比赛的地方开始,这将只是给你相同的位置!您需要使用string.find(fragment, last_match + 1)
,这将要求您跳过箍以使用哨兵作为初始值last_match
。
Achim's answer回答是:您应该使用现有功能来执行此操作。