Как исправить этот код для распознавания перекрывающихся строк?

entrada = str(input().lower())

replace = "mem".lower()
find = entrada.lower()
count = 0
while (entrada.find(replace) != -1):
   entrada = entrada.replace(replace, "", 1)
   count +=1

print(count) 

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

пример: строка — мемем, ожидаемый выход — 2


person useruseruser    schedule 24.04.2015    source источник
comment
Во-первых, я не уверен, почему вы используете строку после нижнего. если ввод не является строкой, более низкий, скорее всего, выдаст AttributeError. Также мой вопрос - пользователь предоставляет как подстроку, так и строку?   -  person Rcynic    schedule 24.04.2015
comment
Только строка и она должна быть ниже   -  person useruseruser    schedule 24.04.2015
comment
вы пробовали мой подход из другого вашего потока? ой, жаль, что это был не ты.   -  person Alan Hoover    schedule 24.04.2015


Ответы (2)


Один из способов сделать это — использовать второй аргумент str.find который указывает необязательный индекс для начала поиска подстроки в строке.

Из документов:

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

Поэтому, если мы будем отслеживать last_index, найденный в переменной, мы можем просто снова начать поиск подстроки в следующем возможном индексе. Выраженное в коде, это выражение last_index + 1. Если last_index всегда равно -1, мы прекращаем поиск подстроки и выводим наш счет:

mystr = 'memem'
mysubstr = 'mem'
count = 0
last_index = -1
while True:
    last_index = mystr.find(mysubstr, last_index + 1)
    if last_index == -1:
        break
    count += 1

print(count)
person Shashank    schedule 24.04.2015

Вы могли бы использовать

i = 0
while True:
    i = entrada.find(replace, i) + 1
    if i:
         count += 1
    else:
        break

Затем он найдет replace в entrada, увеличит счетчик, найдет replace в entrada[i+1:], где i — начало предыдущего совпадения, увеличит счетчик и повторит до бесконечности.

person pppery    schedule 24.04.2015