Подсчет экземпляров показывает подстроку
Программист новичка, берущий класс 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