Python 有没有办法阻止input()转义\n?
因此,我尝试允许我的用户在字符串中输入\n以指定新行。 然而,由于某些原因,它被翻译成“\\n”。所以我可以做到:Python 有没有办法阻止input()转义\n?,python,python-3.x,input,newline,Python,Python 3.x,Input,Newline,因此,我尝试允许我的用户在字符串中输入\n以指定新行。 然而,由于某些原因,它被翻译成“\\n”。所以我可以做到: inp = input().replace("\\n", "\n") 但这似乎有点麻烦;有更好的方法吗?你在这里寻找的实际上与你的要求几乎相反 输入不会以任何方式转义字符串;它完全返回用户键入的字符串 事实上,您尝试的解决方案虽然可能不是最好的解决方案,但很好 我认为您的困惑在于,您将源代码中的字符串文字概念与实际字符串值混淆了: 我的印象是,字符串中的\n会导致打印该字符串时
inp = input().replace("\\n", "\n")
但这似乎有点麻烦;有更好的方法吗?你在这里寻找的实际上与你的要求几乎相反
输入
不会以任何方式转义字符串;它完全返回用户键入的字符串
事实上,您尝试的解决方案虽然可能不是最好的解决方案,但很好
我认为您的困惑在于,您将源代码中的字符串文字概念与实际字符串值混淆了: 我的印象是,字符串中的\n会导致打印该字符串时触发新行,例如“exam\nple”中的\n只是一个字符串而不是其他内容 否,
\n
在打印字符串时不会触发新行;只有换行符才能做到这一点
但是,源代码中的字符串文本中的\n
不会在字符串中提供\n
,而是在字符串中提供换行符
当你写这篇文章时:
>>> spam = "exam\nple"
…Python将\n
视为转义序列,并为您提供包含换行符的字符串值。因此:
>>> 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
您需要的是允许用户手动转义他们的输入,就像您在源代码中对文本字符串所做的那样,然后让您的代码应用这些转义序列,就像Python将源代码中的字符串文本转换为字符串值一样 您可以通过手动处理转义序列来实现这一点,如您的代码:
inp = input().replace("\\n", "\n")
但是如果你想处理其他的逃跑,那就太难看了。最简单的方法是应用unicode转义
编解码器,如下所示:
inp = codecs.decode(input(), "unicode-escape")
现在,如果用户键入abc\ndef
,则将取消转换为abc
、换行符和def
无论哪种方式,如果您想多次这样做,您都可以编写一个包装函数:
def unescaped_input(prompt=""):
return codecs.decode(input(prompt), "unicode-escape")
……现在:
inp = unescaped_input()
输入
未转义\n
。字符串的内容与其表示形式之间存在差异。如果您写的是\n
,那么您写的是反斜杠和n
,而不是新行。Input不会解释该行(就像Python解释器那样)Input()。replace(r'\n','\n')
@WillemVanOnsem我的印象是,字符串中的\n导致在打印该字符串时触发新行,例如“exam\n”中的\n只是一根线,其他什么都没有。我想你在这里寻找的与你要求的正好相反。您希望接受用户显式转义的字符串,并取消对它们的转义,对吗?@Chaoscrasher,len('foo\nbar')
是7,而不是8,因为\n
正是Python写出单个(换行)字符的方式;这不是一个反斜杠,后面跟着一个n
(如果是这样的话,它将被写成'foo\\nbar'
,反斜杠加倍表示它是字面意思)。谢谢你真的向我解释了这一点,并且说得很清楚,而不是只是开怀大笑,我真的很感谢你花时间:D;我不知道\n实际上是->escapedwas