Вопрос по Python
s = input()
count = len(s)
i = -1
while count > 0:
i += 1
if s[i] == '[':
s = s.replace(s[i : i + 8], chr(int(s[i + 3 : i + 7])))
count -= 1
print(s)
При введении: Hello, my name is [u-1061][u-1072][u-1082][u-1080]!
Почему-то постоянно выдаёт ошибку. Причём только при несколько раз повторяющихся скобках '['. Как только такая скобка в строке один раз или её вообще нет, ошибки нет.
Текст ошибки:
Traceback (most recent call last):
File "jailed_code", line 7, in <module>
if s[i] == '[':
IndexError: string index out of range
Сижу уже несколько часов, не могу понять проблему. Цикл менял на for, всё равно не работает, я не понимаю почему так... Несколько раз сам проходился, вроде должно работать...
Очень надеюсь на ваше объяснение
Конечно! Вот перевод:
Ошибка, с которой вы столкнулись, IndexError: string index out of range, возникает из-за того, что ваш цикл продолжает увеличивать i, даже после изменения строки. Когда вы заменяете подстроку, длина s изменяется, но count остается прежним, что приводит к попыткам доступа к индексам, которые больше не существуют.
Чтобы исправить это, рассмотрите возможность итерации по строке в обратном порядке или измените свою логику, чтобы учитывать изменения в длине после каждой замены. Вот модифицированная версия вашего кода:
s = input()
while '[' in s:
start = s.find('[')
end = s.find(']', start)
if end == -1: break # Закрывающая скобка не найдена
s = s[:start] + chr(int(s[start + 3:end - 1])) + s[end + 1:]
print(s)
Эта версия находит и заменяет каждую подстроку в скобках без возникновения ошибок индекса.
Зачем делать просмотр строки вручную циклом? В Python встроен модуль регулярных выражений:
import re
s = input()
s = re.sub(r'\[u-(\d+)\]', lambda v: chr(int(v[1])), s)
print(s)