Как посчитать все вхождения слова в строку, используя python

Я пытаюсь узнать, сколько раз слово «bob» встречается в строке символов, таких как «abdebobdfhbobob».

Мой код (который я нашел с помощью другого вопроса stackoverflow):

s = 'abdebobdfhbobob'  
print 'The number of times bob occurs is: ' + str(s.count('bob'))

Этот код распечатывает:Количество раз, когда происходит боб: 2 что не правильно для того, что мне нужно, так как ответ должен быть 3.

Проблема в том, что этот код не считается 'abdebobdfhbobob'как два разных бобов, что я и хочу.

Как я могу исправить код, чтобы считать часть строки бобоба как два отдельных боба?

Ответы на вопрос(4)

почему ты не делаешь это легко?

bobc=0
for i in range (0,len(s)-2):
    if s[i:i+3]=='bob':
        bobc+=1
        i=+1
print('Number of bob:'+str(bobc))

Если вы не хотите использовать регулярные выражения, вы можете создать все триплеты из строки, используяzip а затем использоватьlist.count:

>>> word = 'bob'
>>> triplets = (''.join(k) for k in zip(*[s[i:] for i in range(len(word))]))
>>> triplets.count(word)
3

Триплеты создаются путем архивирования следующих строк:

     ▼     ▼ ▼
'abdebobdfhbobob'
'bdebobdfhbobob'
'debobdfhbobob'
     ▲     ▲ ▲

Если вы не против работать с кортежами:

>>> word = 'bob'
>>> triplets = zip(*[s[i:] for i in range(len(word))])
>>> triplets.count(tuple(word))
3

Совет: Если вы собираетесь считать и другие слова, используйтеcollections.Counter.

Решение Вопроса

На основедокументация, str.count() вернуть количество неперекрывающихся вхождений подстроки sub в диапазоне[start, end], Вы можете использоватьпозитивный взгляд на основе регулярного выражения, чтобы найти перекрывающиеся строки:

>>> import re
>>> s = 'abdebobdfhbobob'
>>> len(re.findall(r'(?=bob)', s))
3

Если вы не хотите использовать регулярные выражения, вы можете использовать выражение генератора вsum() функция, которая будет перебирать все подстроки длиной 3 и подсчитывать количество тех, которые равны 'bob':

>>> sum(s[i:i+3] == 'bob' for i in range(len(s)-2))
3
 Tonechas12 июн. 2016 г., 11:19
Стоит отметить, что если счетчик предназначен длябез учета регистра, s следует заменить наs.lower() в решениях выше.

Мы можем просто проверить все возможные кандидаты:

def count_substrings(sub, main):
    n = len(sub)
    return sum(sub == main[i : i+n] for i in range(len(main) - n + 1))

s = 'abdebobdfhbobob'
sub = 'bob'
print('The number of times %s occurs is: %d' % (sub, count_substrings(sub, s)))  # 3

Ваш ответ на вопрос