在不使用库函数的情况下查找字符串中子字符串的出现次数

时间:2014-01-28 16:21:38

标签: python string

我必须在不使用库函数的情况下进行此练习。到目前为止,我到达了这里: -

string = input("Enther The String :")
substring = input("Enter the substring :") 
count = 0
for i in range(len(string)):
    if string[i:i+len(substring)] == substring:
        if string[i+len(substring)] == ' ':
            count += 1
        else:
            count = 0
print(count)

但是,让我们说如果子串是'bob'并且字符串是'bob cat bob cat bobs cat',程序仍然会在'bobs'中计算'bob'而我不希望这样。此代码也始终返回0.请帮忙!谢谢!

2 个答案:

答案 0 :(得分:2)

  

程序仍然在'bobs'中计算'bob'

没有。

  

此代码也始终返回0

这是因为你的else子句。

        else:
            count = 0

你在这里重置计数。那不是你想要的;如果下一个字符不是空格,你根本不想做任何事情。删除整个else子句。

您还有一个未注意到的其他错误。如果stringsubstring结尾,则进行以下测试:

        if string[i+len(substring)] == ' ':

将尝试读取字符串的结尾并抛出IndexError。首先尝试解决这个问题。

答案 1 :(得分:0)

由于你被允许使用切片,所以你可以用它来检查子串之前/之后的字符是空格还是空字符串,如果是则递增计数为1.注意切片永远不会引发异常,即使是超出范围的指数。

def sub_str_count(s, sub_str):
    le = len(sub_str)
    count = 0
    for i in range(len(s)):
        if s[i:i+le] == sub_str and s[i-1:i] in ('', ' ') and \
                                                       s[i+le:i+le+1] in ('', ' '):
            count += 1
    return count

基于异常处理的上述代码版本:

def check(s, ind):
    """
    Check whether the item present at this index is a space or not.
    For out of bound indices return True.
    For negative indices return True.
    """

    if ind < 0:
        return True
    try:
        return s[ind] == ' '
    except IndexError:
        return True

def sub_str_count(s, sub_str):
    le = len(sub_str)
    count = 0
    for i in range(len(s)):
        if s[i:i+le] == sub_str and check(s, i-1) and check(s, i+le):
            count += 1
    return count