如何处理反斜杠转义字符串?

137 投票
6 回答
118707 浏览
提问于 2025-04-15 16:54

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

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

不过,这样做需要把一个(可能不可信的)字符串传给eval(),这存在安全风险。请问在标准库中有没有什么函数,可以接收一个字符串并返回一个没有安全隐患的字符串呢?

6 个回答

47

所有给出的答案在处理一般的Unicode字符串时都会出问题。根据我的了解,下面这个方法在Python3中在所有情况下都能正常工作:

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')

正如obataku所建议的,你也可以使用literal_eval方法,这个方法来自ast模块,使用方法如下:

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错误,而使用编码/解码的方法仍然可以正常工作。

52

你可以使用 ast.literal_eval,这个方法是安全的:

安全地计算一个表达式节点或者包含Python表达式的字符串。提供的字符串或节点只能由以下Python基本结构组成:字符串、数字、元组、列表、字典、布尔值和None。

用法如下:

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

在编程中,有时候我们需要处理一些数据,可能会用到数组。数组就像一个盒子,里面可以放很多东西,比如数字、文字等。我们可以通过数组的索引来访问这些东西,索引就像是盒子里的标签,告诉我们每个东西放在哪里。

有些时候,我们想要把数组里的某些元素提取出来,或者对它们进行一些操作。这就需要用到循环。循环就像是一个机器人,它会按照我们设定的规则,逐个检查数组里的每个元素,直到完成所有的任务。

在处理数据时,我们还可能需要判断一些条件,比如说如果某个元素满足特定条件,就执行某个操作。这时候就需要用到条件语句。条件语句就像是一个选择题,告诉程序在不同情况下该做什么。

总之,数组、循环和条件语句是编程中非常重要的工具,帮助我们更高效地处理和管理数据。

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

撰写回答