计算字符串中的子串数

时间:2017-05-20 06:47:02

标签: python string loops error-handling while-loop

我正在进行Python任务,我被困在这里。

显然,我必须编写一个代码来计算字符串中给定子字符串的数量。

我以为我做对了,然后我被困在这里。

def count(substr,theStr):
    # your code here
    num = 0
    i = 0
    while substr in theStr[i:]:
        i = i + theStr.find(substr)+1
        num = num + 1

    return num

substr = 'is'
theStr = 'mississipi'
print(count(substr,theStr))

如果我执行此操作,我希望得到 2 ,而不是 3 ......

请参阅,anabanana等其他示例正常,但此具体示例仍然会出错。我不知道我在这里做错了什么。

请你帮帮我。

3 个答案:

答案 0 :(得分:2)

在您的代码中

while substr in theStr[i:]:

正确地在目标字符串theStr上前进,但是

i = i + theStr.find(substr)+1

始终从theStr开始。

str.find方法接受可选的 start end 参数来限制搜索:

  

str.find(sub[, start[, end]])

     

返回找到substring sub 的字符串中的最低索引   在切片s[start:end]内。可选参数 start end   被解释为切片表示法。如果找不到 sub ,则返回-1。

我们真的不需要在这里使用in:我们可以检查find是否不返回-1。当我们需要使用in重复搜索以获取子字符串的索引时,执行find搜索会有点浪费。

我假设您要查找重叠匹配,因为str.count方法可以找到非重叠匹配,并且因为它在C中实现,所以比在Python中自己实现它更有效。

def count(substr, theStr):
    num = i = 0
    while True:
        j = theStr.find(substr, i)
        if j == -1:
            break
        num += 1
        i = j + 1
    return num

print(count('is', 'mississipi'))
print(count('ana', 'bananana'))

<强>输出

2
3

此代码的核心是

j = theStr.find(substr, i)

i初始化为0,因此我们从theStr的开头开始搜索,并且因为i = j + 1后续搜索从最后找到的匹配后的索引开始查找。

答案 1 :(得分:0)

您需要的代码更改是 -

i = i + theStr[i:].find(substr)+ 1

而不是

i = i + theStr.find(substr)+ 1

在您的代码中,始终找到子字符串,直到i到达位置4或更高位置。但是在找到子字符串的索引时,您使用的是原始(整个)字符串,而该字符串又将位置返回为1。

banana的示例中,首次迭代后i变为2.因此,在下一次迭代中,str[i:]变为nana。并且此切片字符串中子字符串ana的位置和原始字符串是1.因此,代码中的错误只是被抑制,代码似乎工作正常。

如果您的代码纯粹是出于学习目的,那么您可以这样做。否则,您可能希望使用python提供的函数(如count())来完成这项工作。

答案 2 :(得分:0)

  

计算子字符串的数量:

def count(substr,theStr):
    num = 0
    for i in range(len(theStr)):
        if theStr[i:i+len(substr)] == substr:
            num += 1
    return num

substr = 'is'
theStr = 'mississipi'
print(count(substr,theStr))
     

O / P:2

     

其中theStr [i:i + len(substr)]是切片字符串,我是strating索引和   1 + LEN(SUBSTR)        正在结束索引

Eg.
    i = 0
    substr length  = 2

    first-time compare substring is => mi

String slice more details :
    https://docs.python.org/3/library/functions.html#slice
     

[1]:https://docs.python.org/3/library/functions.html#slice