Python - найти подстроку в строке (код не работает)

1

Я пишу код, где вы вводите строку (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)
  • 0
    Если i.find(sb,x) не найдет вашу подстроку, он вернет -1 , что вернет вас в начало строки. Вы должны проверить, что он вернул, и разорвать ваш цикл, если он вернет -1 .
  • 0
    Хотите знать, почему ваш код не работает, или вам просто нужно рабочее решение?
Показать ещё 2 комментария
Теги:

4 ответа

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(..) пор, пока .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' есть четыре матча с 'AAA':

  AAADAAAAAM
1 AAA
2     AAA
3      AAA
4       AAA
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)
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. :)

Это будет работать для "ADAM" и "A" с правильными 2, а также для других подстрок, таких как "DABCEABC" и "ABC" с правильными 2, "AAADAAAAAM" и "AAA" с правильными 5.

  • 0
    Я не хочу их печатать, просто предоставляя лучший способ сделать что-то. Как op получает помощь, выполняя цикл while, когда последовательный цикл over enumerate дает такую же конструкцию
  • 0
    Также ошибка заключается в индексации, поэтому это правильное и лучшее решение, поскольку оно позволяет избежать ручной индексации.
Показать ещё 3 комментария
-4

Ниже код будет работать в соответствии с вашими потребностями:

i.count(sb,0,len(i))

  • 0
    Это не поддерживает перекрывающиеся вхождения подстроки.
  • 0
    Это будет выполнять только неперекрывающиеся совпадения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню