Подтвердить что ты не робот

Python: найдите подстроку в строке и верните индекс подстроки

У меня есть:

  • функция: def find_str(s, char)

  • и строка: "Happy Birthday",

По сути, я хочу вводить "py" и возвращать 3, но вместо этого я возвращаю 2.

Код:

def find_str(s, char):
    index = 0           
    if char in s:
        char = char[0]
        for ch in s:
            if ch in s:
                index += 1
            if ch == char:
                return index

    else:
        return -1

print(find_str("Happy birthday", "py"))

Не уверен, что случилось!

4b9b3361

Ответ 1

В идеале вы должны использовать str.find или str.index, как сказал сумасшедший ежик. Но ты сказал, что не можешь...

Ваша проблема в том, что ваш код ищет только первый символ вашей строки поиска, который (первый) находится в индексе 2.

Вы в основном говорите, что если char[0] находится в s, увеличивайте index до ch == char[0] который вернул 3, когда я проверял его, но это все равно было неправильно Вот способ сделать это.

def find_str(s, char):
    index = 0

    if char in s:
        c = char[0]
        for ch in s:
            if ch == c:
                if s[index:index+len(char)] == char:
                    return index

            index += 1

    return -1

print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))

Это произвело следующий вывод:

3
8
-1

Ответ 2

Есть встроенный метод для строковых объектов для этого в python, который вы знаете?

s = "Happy Birthday"
s2 = "py"

print s.find(s2)

Python - это "язык с включенными батареями", написанный для выполнения большей части того, что вы хотите (независимо от того, что вы хотите).. если это не домашняя работа:)

Изменить: find возвращает -1, если строка не найдена.

Ответ 3

поздно для вечеринки, искал то же самое, что и "in" недействительно, я только что создал следующее.

def find_str(full, sub):
    index = 0
    sub_index = 0
    position = -1
    for ch_i,ch_f in enumerate(full) :
        if ch_f.lower() != sub[sub_index].lower():
            position = -1
            sub_index = 0
        if ch_f.lower() == sub[sub_index].lower():
            if sub_index == 0 :
                position = ch_i

            if (len(sub) - 1) <= sub_index :
                break
            else:
                sub_index += 1

    return position

print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))

который производит

3
8
-1

удалить lower() в случае, если нечувствительность к регистру не нужна.

Ответ 4

Непосредственно не отвечая на вопрос, но недавно я получил похожий вопрос, в котором меня просили подсчитать, сколько раз повторяется подстрока в данной строке. Вот функция, которую я написал:

def count_substring(string, sub_string):
    cnt = 0
    len_ss = len(sub_string)
    for i in range(len(string) - len_ss + 1):
        if string[i:i+len_ss] == sub_string:
            cnt += 1
    return cnt

Функция find(), вероятно, возвращает только индекс первого появления. Хранение индекса вместо простого подсчета может дать нам различный набор индексов, подстрока которого повторяется внутри строки.

Отказ от ответственности: я "чрезвычайно" новичок в программировании на Python.

Ответ 5

Добавление в ответ @demented hedgehog об использовании find()

С точки зрения эффективности

Возможно, стоит сначала проверить, находится ли s1 в s2, прежде чем вызывать find().
Это может быть более эффективным, если вы знаете, что в большинстве случаев s1 не будет подстрокой s2

Так как оператор in очень эффективен

 s1 in s2

Это может быть более эффективным для преобразования:

index = s2.find(s1)

в

index = -1
if s1 in s2:
   index = s2.find(s1)

Это полезно, когда find() будет много возвращать -1.

Я нашел это значительно быстрее, так как find() вызывался в моем алгоритме много раз, поэтому я подумал, что стоит упомянуть