То, что вы ищете здесь, на самом деле почти противоположно тому, что вы просите.
input
ни в коем случае не экранирует строку; он возвращает именно ту строку, которую набрал пользователь.
И, на самом деле, ваша попытка исправить это, хотя, возможно, и не лучшее решение, хорошо.
Я думаю, что вы путаетесь в том, что вы смешиваете понятие строковых литералов в исходном коде с фактическими строковыми значениями:
У меня сложилось впечатление, что \ n в строке приводит к запуску новой строки при печати этой строки и что \ n в, например, «exam \ nple» - это просто строка и ничего больше.
Нет, \n
в строке не приводит к запуску новой строки при печати строки; только символ новой строки делает это.
Но \n
в строковом литерале в вашем исходном коде не дает вам \n
в строке, он дает вам символ новой строки в строке.
Когда вы пишете это:
>>> spam = "exam\nple"
… Python обрабатывает \n
как escape-последовательность и выдает строковое значение, содержащее символ новой строки. Итак:
>>> print(spam)
exam
ple
Строка не имеет обратной косой черты и n
, в ней есть символ новой строки. Если бы у вас была строка, в которой имелось , с обратной косой чертой и n
, она напечатала бы ее. Например:
>>> spam = r"exam\nple"
>>> print(spam)
exam\nple
>>> spam = "exam" + chr(92) + "nple"
>>> print(spam)
exam\nple
И это именно то, что здесь происходит: input
, опять же, дает вам именно те символы, которые набрал пользователь, включая обратную косую черту и n
.
Вы можете запутать себя еще больше, посмотрев на repr
строки, потому что repr
не просто показывает вам строку, она показывает вам строковый литерал, который вы можете передать в Python, чтобы получить обратно строка:
>>> spam = "exam\nple"
>>> print(spam)
exam
ple
>>> spam
'exam\nple'
Итак, это объясняет, почему это работает:
inp = input().replace("\\n", "\n")
Дело не в том, что в строке пользователя содержится \\n
, а в том, что строковый литерал "\\n"
в вашем источнике является обратной косой чертой и n, что соответствует тому, что находится на входе пользователя, тогда как строковый литерал "\n"
в ваш источник - это новая строка, которую вы хотите заменить обратной косой чертой и n на
Что вам нужно, так это позволить пользователю вручную экранировать свой ввод, точно так же, как вы делали бы это в литеральной строке в исходном коде, а затем ваш код применял эти escape-последовательности таким же образом. Python превращает строковые литералы в вашем исходном коде в строковые значения.
Вы можете сделать это, вручную обработав escape-последовательности, такие как ваш код:
inp = input().replace("\\n", "\n")
Но это ужасно, если вы хотите справиться с другими побегами. Самый простой способ сделать это - применить кодек unicode-escape
, например:
inp = codecs.decode(input(), "unicode-escape")
Теперь, если пользователь введет abc\ndef
, он будет удален в abc
, перевод строки и def
.
В любом случае, если вы хотите сделать это много раз, вы можете написать функцию-обертку:
def unescaped_input(prompt=""):
return codecs.decode(input(prompt), "unicode-escape")
… а теперь:
inp = unescaped_input()