Подсчет экземпляров показывает подстроку

Программист новичка, берущий класс CS. Использование Python 2.7 в Ubuntu 14.04 с ноутбуком HPmini(процессор Atom). Сколько "ана" в "анализе бананов в Канаде". Результат должен быть 4, а не 3, у банана 2 случая "ана". // f.find() даст мне индекс, ничего хорошего. Есть ли способ нарезать цикл поиска внутри цикла for, например: if i [n: n + 4] == 'ana':? Так что на каждой итерации он ожидает 3 символа и выполняет тест 'blah=='ana': // какие методы нужны. Заранее спасибо за внимание к этому. Не нужен точный ответ, просто идея. мой настоящий / ближайший код:

  g="Canada's bananas analysis"  # main string
  b='ana'                        # sub-string to be found
  anaSt=g.count(b)               # meant to count instances of 'ana'
  lenG=len(g)                    #length of main string
  k=0
  for i in range(lenG):
      if 'ana' in g:
          k +=1
          print 'k: ', k,
  print '\n', lenG
  print "'ana' in string: ",anaSt

4 ответа

Решение

Проблема с использованием .count или же .find если вы не нашли перекрывающихся строк:

>>> "banana".find("ana")
1
>>> "banana".count("ana")
1

Вы можете сделать что-то вроде этого:

>>> g="Canada's bananas analysis"
>>> sub_string="ana"
>>> [1 for i in range(0, len(g)-len(sub_string)) if g[i:i+len(sub_string)]==sub_string] 
[1, 1, 1, 1]

Или более шаг за шагом:

>>> count=0
>>> for i in range(0, len(g)-len(sub_string)):
...     if g[i:i+len(sub_string)]==sub_string:
...         count+=1
... 
>>> count
4

Ре "Не нужен точный ответ, просто идея", здесь вам нужны регулярные выражения ("Импортировать заново") с использованием lookahead.

Или вы, конечно, можете сделать что-то вроде:

for i in range(lenG - len(b)):
    if g[i:i + len(b)] == b:

(Мне просто нравится использовать регулярные выражения.:-))

Если бы я сам запрограммировал процедуру, я бы использовал find() метод str объекты. Его синтаксис:

<string_name>.find(substring [, index])

где index является (необязательным) индексом символа, с которого начинается поиск, а возвращаемым значением является индекс первого совпадения (или -1, если совпадений не было).

Итак, простой алгоритм может быть:

idx <- 0          # start from the beginning of the string
count <- 0        # number of matches
while True:
    idx <- index_of_next_match # returned by the find() method
    check_idx()   # check return value of find()
    if idx_is_OK:
        idx++     # otherwise find() returns always the same match
        count++
    else:
        break

Я думаю, что сделал бы это с помощью регулярного выражения. Хитрость заключается в том, что для захвата перекрывающихся совпадений вы должны использовать предпросмотр вместо обычного совпадения. Для этого примера это будет выглядеть следующим образом:

src="Canada's bananas analysis"
x = re.compile(r'(?=ana)', re.IGNORECASE)
f = x.findall(src)
print len(f)

4
Другие вопросы по тегам