有没有办法阻止 input() 转义 \n ?

Cha*_*her -1 python newline input python-3.x

所以我试图允许我的用户在字符串中输入 \n 来指定新行。然而由于某种原因,它被翻译成“\\n”。所以我可以这样做:

inp = input().replace("\\n", "\n")
Run Code Online (Sandbox Code Playgroud)

但这似乎有点麻烦;有没有更好的办法?

aba*_*ert 6

您在这里寻找的实际上与您要求的几乎相反。

\n\n

input不以任何方式转义字符串;它返回的正是用户输入的字符串。

\n\n

事实上,您尝试解决的问题虽然可能不是最好的解决方案,但很好。

\n\n
\n\n

我认为您的困惑在于您将源代码中字符串文字的概念与实际的字符串值混淆了:

\n\n
\n

我的印象是,字符串中的 \\n 会在打印该字符串时触发新行,并且“exam\\nple”中的 \\n 只是一个字符串,没有其他内容。

\n
\n\n

不会,\\nin a string 不会导致打印字符串时触发新行;只有换行符才能做到这一点。

\n\n

但是\\n在源代码中的字符串文字中,不会\\n在字符串中给出,而是在字符串中给出换行符。

\n\n

当你写下这个:

\n\n
>>> spam = "exam\\nple"\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 Python 将 视为\\n转义序列,并为您提供包含换行符的字符串值。所以:

\n\n
>>> print(spam)\nexam\nple\n
Run Code Online (Sandbox Code Playgroud)\n\n

该字符串中没有反斜杠和 an n,其中有换行符。如果你有一个字符串,里面一个反斜杠和一个n,它会打印出来。例如:

\n\n
>>> spam = r"exam\\nple"\n>>> print(spam)\nexam\\nple\n>>> spam = "exam" + chr(92) + "nple"\n>>> print(spam)\nexam\\nple\n
Run Code Online (Sandbox Code Playgroud)\n\n

这正是这里发生的事情:input再次为您提供用户键入的字符,包括反斜杠和n

\n\n

通过查看repr字符串的 ,您可能会更加困惑,因为它repr不仅显示字符串,还显示一个字符串文字,您可以将其输入到 Python 中以获取该字符串:

\n\n
>>> spam = "exam\\nple"\n>>> print(spam)\nexam\nple\n>>> spam\n\'exam\\nple\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,这解释了为什么它有效:

\n\n
inp = input().replace("\\\\n", "\\n")\n
Run Code Online (Sandbox Code Playgroud)\n\n

这并不是说用户的字符串包含在\\\\n其中,而是源中的字符串文字"\\\\n"是一个反斜杠和一个 n,它与用户输入中的内容匹配,而源代码中的字符串文字"\\n"是换行符,这是您想要替换反斜杠和 n 的内容。

\n\n
\n\n

您正在寻找的是允许用户手动转义他们的输入,就像您在源代码中的文字字符串中所做的那样,然后让您的代码应用这些转义序列,就像Python一样将源代码中的字符串文字转换为字符串值。

\n\n

您可以通过手动处理转义序列来做到这一点,例如您的代码:

\n\n
inp = input().replace("\\\\n", "\\n")\n
Run Code Online (Sandbox Code Playgroud)\n\n

但如果你想处理其他转义,那就很难看了。最简单的方法是应用unicode-escape编解码器,如下所示:

\n\n
inp = codecs.decode(input(), "unicode-escape")\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,如果用户输入abc\\ndef,它将被转义为abc、换行符和def

\n\n

无论哪种方式,如果您想多次执行此操作,您可以编写一个包装函数:

\n\n
def unescaped_input(prompt=""):\n    return codecs.decode(input(prompt), "unicode-escape")\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 现在:

\n\n
inp = unescaped_input()\n
Run Code Online (Sandbox Code Playgroud)\n