Python-在字符串中查找子字符串(代码不起作用)

时间:2018-09-25 11:00:20

标签: python

我正在编写代码,在其中输入字符串(i)和子字符串(sb),并且代码应计算子字符串出现在字符串中且重叠的次数。

如果输入字符串“ AAAA”并查找“ A”(返回正确的数量,4),则该代码有效,但是如果输入“ ADAM”并查找“ A”,则该代码将陷入无限循环。

我一生无法解决这个问题。

i = input("Enter a string:")
sb = input("Enter a substring:")

count = 0
x = 0    #index from the string found
idxTotal = len(i)  

while True:

    i.find(sb,x)

    if x != idxTotal:
        count += 1
        x = i.find(sb,x)+1

    else:
        break

print(count)

4 个答案:

答案 0 :(得分:5)

我认为您使事情变得太复杂了。基本上,您应该在while循环中检查我们没有到达字符串的末尾。此外,您应该通过增加偏移值来保证进步。

所以我们可以这样写:

x = i.find(sb)
n = 0
while x >= 0:
    n += 1
    x = i.find(sb, x+1)
# here n is the number of occurrences
print(n)

因此,我们首先执行i.find(sb)来查找第一个匹配项,然后将n(计数)设置为零,每次x >= 0都找到下一个匹配项,因此我们增加n,然后寻找下一个出现的地方。

我们一直这样做,直到.find(..)返回-1。在这种情况下,while循环将停止,而n将包含元素数。

例如:

>>> i = 'ADAM'
>>> sb = 'A'
>>> x = i.find(sb)
>>> n = 0
>>> while x >= 0:
...     n += 1
...     x = i.find(sb, x+1)
...
>>> print(n)
2

这还会执行重叠计数,例如:

>>> i = 'AAADAAAAAM'
>>> sb = 'AAA'
>>> x = i.find(sb)
>>> n = 0
>>> while x >= 0:
...     n += 1
...     x = i.find(sb, x+1)
...
>>> print(n)
4 

因此,'AAADAAAAAM'的{​​{1}}有四场比赛:

'AAA'

答案 1 :(得分:0)

您可以尝试

some_string = input("Enter a string:")
some_substring = input("Enter a substring:")
total = 0
for index, some_char in enumerate(some_string):
  # print(index, some_char) # try this to see what comes in the loop
  if some_string[index:].startswith(some_substring):
    total = total + 1

print(total)

它更优雅,请避免使用while(True),因为i.find将返回-1,因此您将陷入无限循环。这将使您避免使用while手动索引。 :)

这对于具有正确2的“ ADAM”和“ A”以及具有正确2的其他子字符串(如“ DABCEABC”和“ ABC”),具有正确5的其他子字符串均有效。

答案 2 :(得分:0)

由于未找到子字符串时find方法返回-1,因此我将使用它结束while循环。

通过执行以下操作,您计数直到不再找到子字符串:

i = input("Enter a string:")
sb = input("Enter a substring:")

count = 0
x = 0  

while True:
    x = i.find(sb,x)+1  #x will be 0 if sb isn't found
    if x != 0:          #if x = 0 the while loop will end
        count += 1
    else:
        break

print(count)

答案 3 :(得分:-4)

以下代码将根据您的需要运行:

viewDidLoad()