Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何取消反斜杠转义字符串的转义?_Python_String_Escaping - Fatal编程技术网

Python 如何取消反斜杠转义字符串的转义?

Python 如何取消反斜杠转义字符串的转义?,python,string,escaping,Python,String,Escaping,假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在Python中,有没有一种简单的方法来取消对字符串的scape?例如,我可以: >>> escaped_str = '"Hello,\\nworld!"' >>> raw_str = eval(escaped_str) >>> print raw_str Hello, world! >>> 但是,这涉及将一个(可能不受信任的)字符串传递给eval(),这是一种安全风

假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在Python中,有没有一种简单的方法来取消对字符串的scape?例如,我可以:

>>> 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'
开始,python2
print 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'
是字符串的转义版本。