如何在python中取消反斜杠转义字符串?

时间:2009-12-11 01:00:01

标签: python string escaping

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

>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>> 

然而,这涉及将(可能不受信任的)字符串传递给eval(),这是一个安全风险。标准库中是否有一个函数,它接受一个字符串并生成一个没有安全隐患的字符串?

4 个答案:

答案 0 :(得分:126)

>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"

答案 1 :(得分:30)

您可以使用安全的ast.literal_eval

  

安全地评估表达式节点或包含Python的字符串   表达。提供的字符串或节点可能只包含   以下Python文字结构:字符串,数字,元组,列表,   dicts,booleans和None。 (END)

像这样:

>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!

答案 2 :(得分:14)

在python 3中,str个对象没有decode方法,您必须使用bytes个对象。 ChristopheD的答案涵盖了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"

答案 3 :(得分:0)

所有给定的答案将在通用Unicode字符串上中断。据我所知,以下代码在所有情况下都适用于Python3:

from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)