Есть гораздо более эффективные способы, но в вашем коде, вам нужно, чтобы проверить, когда находка возвращается -1
для не спички и увеличения индекса тем, что найти возвращается, когда вы получаете спичку, вы всегда добавляя независимо и только перемещение одного индекса, так что если есть позже матч вы продолжаете находить тот же начальный индекс подстроки:
s = 'bobobzbobz'
word = 'bob'
index = 0
instance = []
while index < len(s) - len(word):
f = s.find(word, index)
if f != -1:
instance.append(f)
index = f
index += 1
print (instance)
[0, 2, 6]
вы не можете использовать .count
, когда вы хотите, чтобы рассмотреть перекрывающиеся подстроки, как в приведенном выше примере.
Чтобы разбить его на одну итерации с использованием s = 'bobzbobz'
:
s.find(word, 0) -> 0 # s[index:] -> 'bobzbobz'
s.find(word, 1) -> 4 # s[index:] -> 'obzbobz'
s.find(word, 2) -> 4 # s[index:] -> 'bzbobz'
s.find(word, 3) -> 4 # s[index:] -> 'zbobz'
s.find(word, 4) -> 4 # s[index:] -> 'bobz'
s.find(word, 5) -> -1 # s[index:] -> 'obz'
s.find(word, 6) -> -1 # s[index:] -> 'bz'
s.find(word, 7) -> -1 # s[index:] -> 'z'
Вы получаете четыре 4-е в списке вывода, как от индекса 1 к индексу 4 находки найти подстроку слово, начиная с индексом 4, после чего индекса переместился мимо последнего bob, т. е. индекса 4, так что вы получаете -1 добавленный каждый раз, когда find не находит совпадения.
Если это все, что вам нужно, 's.count (word)' сделает это за вас :-) – alexis
Вы получаете -1, потому что, когда подстрока не найдена, find возвращает -1, вы продолжаете получать 4, потому что вы держите поиск последнего боба по мере того, как вы только перемещаете индекс на одно место –
Чтобы узнать, что происходит с вашим кодом, подумайте, что произойдет, когда 'index' равен 1 ... – alexis