Python 如何取消反斜杠转义字符串的转义?
假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在Python中,有没有一种简单的方法来取消对字符串的scape?例如,我可以:Python 如何取消反斜杠转义字符串的转义?,python,string,escaping,Python,String,Escaping,假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在Python中,有没有一种简单的方法来取消对字符串的scape?例如,我可以: >>> escaped_str = '"Hello,\\nworld!"' >>> raw_str = eval(escaped_str) >>> print raw_str Hello, world! >>> 但是,这涉及将一个(可能不受信任的)字符串传递给eval(),这是一种安全风
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
但是,这涉及将一个(可能不受信任的)字符串传递给eval(),这是一种安全风险。标准库中是否有一个函数,它接受一个字符串并生成一个没有安全含义的字符串?您可以使用安全的
ast.literal\u eval
:
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
安全地计算表达式节点或包含Python的字符串
表情。提供的字符串或节点只能由
以下Python文本结构:字符串、数字、元组、列表、,
口授、布尔语和无语。(完)
像这样:
>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
在Python3中,
str
对象没有decode
方法,必须使用bytes
对象。克里斯托弗的回答涵盖了python 2
# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")
# or directly
my_bytes = b"Hello,\\nworld"
print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"
所有给出的答案将在通用Unicode字符串上中断。就我所知,以下内容在所有情况下都适用于Python3:
从编解码器导入编码,解码
样本=u'mon€y\\nöcks'
结果=解码(编码(示例,'latin-1','backslashreplace'),'unicode转义')
打印(结果)
在最近的Python版本中,这也可以在没有导入的情况下工作:
sample=u'mon€y\\nöcks'
结果=示例。编码('latin-1','backslashreplace')。解码('unicode-escape'))
如注释中所述,您也可以使用ast
模块中的方法,如下所示:
导入ast
样本=u'mon€y\\nöcks'
打印(ast.literal_eval(F'{sample}'))
或者,当字符串真的包含字符串文字(包括引号)时:
导入ast
样本=u“mon€y\\nröcks”
打印(ast.literal_eval(示例))
但是,如果不确定输入字符串是使用双引号还是单引号作为分隔符,或者根本无法假定它已正确转义,然后,
literal\u eval
可能会产生一个SyntaxError
,而编码/解码方法仍然有效。是否有与Python3兼容的东西?@thejinx0r:看看这里:基本上对于Python3,你想要打印(b“Hello,\nworld!”。解码('unicode\u escape'))
对于Python3,使用value.encode('utf-8')).decode('unicode\u转义')
警告:value.encode('utf-8')。decode('unicode\u转义')
。除非保证输入仅包含ASCII字符,否则这不是有效的解决方案。字符串中有转义分号会破坏此代码。在转义的字符串周围抛出语法错误“意外字符接行连续字符”@darksky请注意,ast
库需要引号(无论是“
还是”
,甚至是“
或”
),因为它实际上试图将其作为Python代码运行,但提高了安全性(防止串注入)@no1xsyzy:OP的例子中哪一个已经是这样了;str
是str
对象的repr
或OP的例子中的bytes
对象时,这是正确的答案;unicode转义
编解码器的答案适用于它不是repr
,而是其他形式的转义文本的情况(字符串数据本身不包含引号)。使用utf-8字符,这将不起作用。请使用codes包签出最后一个答案。它实际上起作用。FWIW我试图解析一些转义的JSON文本,并不断收到此错误[错误]TypeError:字符串索引必须是整数
,此解决方案解决了这一问题。取消字符串的scape,然后将其解析为JSON。将其放在一起,value.encode('utf-8')。decode('unicode_escape')
。如果字符串包含一些utf-8非ascii字符(即波兰语字符),这将很遗憾地中断您是否尝试过在调用encode
时选择适合波兰语的编码?使用utf-8字符,这将不起作用。请使用codes软件包签出最后一个答案。它确实起作用。ast.literal\u eval(“'mon€y\\nröcks'”)==“mon€y\nröcks”
对我来说使用Python 3.7.3很好,感谢@oldrinb!我编辑了答案以包含它。我不相信这能正确处理所有转义UTF-8字符串。例如,从s='\\xe7\\xa7\\x98'
开始,python2print s.decode('string-escape')
prints秘代码>正如我所希望的,但是你在python3中的答案打印出ç§
。对于python3中的另一个相关问题,似乎做了我所期望的:打印(s.encode('latin-1')。解码('unicode_escape')。编码('latin-1')。解码('utf-8'))
。嘿@詹姆斯,你的问题不可能有一个通用的解决方案也会应用“正确的”编码,因为无法知道这是什么。在您的示例中,您期望的是UTF-8,但如果您期望的是CP1252,例如,您的代码显然会失败。但是-如果您将我的代码应用于字符串s='\\u79d8'
,您将得到您要查找的字符!区别在于您的输入是转义的字符它的utf8编码是无效的,但输入的s='\\u79d8'
是字符串的转义版本。