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

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

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

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

97002 次浏览
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"

你可以使用安全的 ast.literal_eval:

安全地计算包含 Python 的表达式节点或字符串 提供的字符串或节点只能由 遵循 Python 文本结构: 字符串、数字、元组、列表、, (完)

像这样:

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

在 python3中,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"

所有给定的答案将在一般 Unicode 字符串上中断。据我所知,以下内容适用于 Python 3的所有情况:

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

在最近的 Python 版本中,这种方法也不需要导入:

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

正如 巴巴塔库所建议的那样,您也可以像下面这样使用 ast模块中的 literal_eval方法:

import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))

如果字符串 真的包含一个字符串文字(包括引号) :

import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))

但是,如果您不确定输入字符串是使用双引号还是单引号作为分隔符,或者根本不能假定它是正确转义的,那么 literal_eval可能会引发 SyntaxError,而 encode/decode 方法仍然可以工作。

对于 Python 3,请考虑:

my_string.encode('raw_unicode_escape').decode('unicode_escape')

“ raw _ Unicode _ escape”编解码器编码为 latin1,但是首先用转义的 '\uXXXX''\UXXXXXXXX'表单替换所有其他 Unicode 代码点。重要的是,它不同于普通的“ unicode _ escape”编解码器,因为它不接触现有的反斜杠。

因此,当应用普通的“ Unicode _ escape”解码器时,新转义的代码点和最初转义的元素都会得到同等对待,结果是一个未转义的本机 Unicode 字符串。

(‘ raw _ unicode _ escape’解码器似乎只关注 '\uXXXX''\UXXXXXXXX'表单,忽略所有其他转义。)

文件: Https://docs.python.org/3/library/codecs.html?highlight=codecs#text-encodings

自定义字符串解析器,只解码一些反斜杠转义符,在本例中为 \"\'

def backslash_decode(src):
"decode backslash-escapes"
slashes = 0 # count backslashes
dst = ""
for loc in range(0, len(src)):
char = src[loc]
if char == "\\":
slashes += 1
if slashes == 2:
dst += char # decode backslash
slashes = 0
elif slashes == 0:
dst += char # normal char
else: # slashes == 1
if char == '"':
dst += char # decode double-quote
elif char == "'":
dst += char # decode single-quote
else:
dst += "\\" + char # keep backslash-escapes like \n or \t
slashes = 0
return dst


src = "a" + "\\\\" + r"\'" + r'\"' + r"\n" + r"\t" + r"\x" + "z" # input
exp = "a" + "\\"   +  "'"  +  '"'  + r"\n" + r"\t" + r"\x" + "z" # expected output


res = backslash_decode(src)


print(res)
assert res == exp