2016-06-12 4 views
3

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

Мой код (который я нашел через другой StackOverflow вопрос) является:

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

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

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

Как исправить код, чтобы считать часть bobob строки как две отдельные бобы?

ответ

6

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

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

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

>>> sum(s[i:i+3] == 'bob' for i in range(len(s)-2)) 
3 
+0

Стоит заметить, что если счетчик предназначен для ** регистронезависимы **, '' s'' должны быть заменены на '' с. lower() '' в вышеприведенных решениях. – Tonechas

0

Если вы не хотите использовать регулярные выражения, вы можете создать все триплеты из строки с помощью 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.

0

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

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 
Смежные вопросы