Есть ли способ остановить экранирование input () \ n? - PullRequest
0 голосов
/ 09 сентября 2018

Поэтому я пытаюсь разрешить моему пользователю вводить \ n в строке, чтобы обозначить новую строку. Однако по какой-то причине это переводится как '\\ n'. Так что я могу сделать:

inp = input().replace("\\n", "\n")

но это кажется немного громоздким; есть ли лучший способ?

1 Ответ

0 голосов
/ 10 сентября 2018

То, что вы ищете здесь, на самом деле почти противоположно тому, что вы просите.

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()
...