Я не знаю, почему этот код python для замены всех вхождений подстроки не работает

#python #string

Вопрос:

 #program to replace all occurences of a substring with a given substring!!!!

def replace_string(str,x,y):
    a = len(x)
    for i in range(len(str)):
        if str[i] == x[0]:   
            end = i a
            sub_str = str[i:end]
            if x == sub_str:
                str = str[:i]   y   str[end:]
            else:
                continue
        else:
            continue
    print (str)

str = input("enter a string- ")
x = input("Input substring to be deleted- ")
y = input("Enter substring to be fit in- ")
replace_string(str,x,y)
 

Вот некоторые результаты, которые он дает

1.

 enter a string- abcabcddabc
Input substring to be deleted- abc
Enter substring to be fit in- haha
 

-> hahahahaddhaha

2.

 enter a string- i am a good boy
Input substring to be deleted-<space> 
Enter substring to be fit in- "
 

-> i"am"a"good"boy

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

 enter a string- i am a good boy
Input substring to be deleted- good
Enter substring to be fit in- bad
 
 Traceback (most recent call last):
  File "f:/----/-----/---------/Fn_replace.py", line 19, in <module>
    replace_string(str,x,y)
  File "f:/----/-----/--------/Fn_replace.py", line 5, in replace_string
    if str[i] == x[0]:
IndexError: string index out of range
 

ПОЖАЛУЙСТА, ПОМОГИТЕ

Ответ №1:

Это связано с тем, что новая строка bad короче, чем good . Для целей отладки я добавляю символ заполнения ^ , чтобы увидеть разницу.

 def replace_string(str,x,y):
    if len(y)<len(x):
        y  = "^"*(len(x)-len(y))   #add padding
    a = len(x)
    for i in range(len(str)):
        if str[i] == x[0]:   
            end = i a
            sub_str = str[i:end]
            if x == sub_str:
                str = str[:i]   y   str[end:]
            else:
                continue
        else:
            continue
    print (str)
 

Выход:

 enter a string-  i am a good boy
Input substring to be deleted-  good
Enter substring to be fit in-  bad
i am a bad^ boy
 

Если вы измените оператор печати на print(str.replace("^", "")) , новый вывод будет

 enter a string-  i am a good boy
Input substring to be deleted-  good
Enter substring to be fit in-  bad
i am a bad boy
 

В целях обучения вы можете использовать эту функцию .replace() для достижения своей конечной цели

 def replace_string(s,x,y):
    print(s.replace(x, y))

s = input("enter a string- ")
x = input("Input substring to be deleted- ")
y = input("Enter substring to be fit in- ")
replace_string(s,x,y)
 

Выход

 enter a string-  i am a good boy
Input substring to be deleted-  good
Enter substring to be fit in-  bad
i am a bad boy
 

P/S: Также, пожалуйста, следуйте совету @Sujay: не используйте » str » в качестве имени переменной, потому что это функция python, пример str(x)

Комментарии:

1. он мог бы использовать функцию, которую он создал, чтобы сделать это тоже 🙂 с помощью пробелов

2. @AdityaGupta, да, это верно! Введите good и bad (с пробелом), убедившись, что оба имеют одинаковую длину символов

Ответ №2:

Длина bad не равна good , следовательно, ошибка. Кроме того, str это встроенная функция в python, поэтому не используйте ее в качестве переменной. Я предлагаю здесь простую программу.

 strr = input("enter a string- ")
x = input("Input substring to be deleted- ")
y = input("Enter substring to be fit in- ")
strr=strr.replace(x,y)
print(strr)
 

Пример:

 strr=hello hello boys
x=hello
y=f

Output: f f hello
 

Комментарии:

1. Но главной задачей было сделать это без функции замены.. Кстати, Спасибо