如何处理反斜杠转义字符串?
假设我有一个字符串,它是另一个字符串的反斜杠转义版本。请问在Python中,有没有简单的方法可以把这个字符串解转义?比如,我可以这样做:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
不过,这样做需要把一个(可能不可信的)字符串传给eval(),这存在安全风险。请问在标准库中有没有什么函数,可以接收一个字符串并返回一个没有安全隐患的字符串呢?
6 个回答
所有给出的答案在处理一般的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
错误,而使用编码/解码的方法仍然可以正常工作。
你可以使用 ast.literal_eval
,这个方法是安全的:
安全地计算一个表达式节点或者包含Python表达式的字符串。提供的字符串或节点只能由以下Python基本结构组成:字符串、数字、元组、列表、字典、布尔值和None。
用法如下:
>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
在编程中,有时候我们需要处理一些数据,可能会用到数组。数组就像一个盒子,里面可以放很多东西,比如数字、文字等。我们可以通过数组的索引来访问这些东西,索引就像是盒子里的标签,告诉我们每个东西放在哪里。
有些时候,我们想要把数组里的某些元素提取出来,或者对它们进行一些操作。这就需要用到循环。循环就像是一个机器人,它会按照我们设定的规则,逐个检查数组里的每个元素,直到完成所有的任务。
在处理数据时,我们还可能需要判断一些条件,比如说如果某个元素满足特定条件,就执行某个操作。这时候就需要用到条件语句。条件语句就像是一个选择题,告诉程序在不同情况下该做什么。
总之,数组、循环和条件语句是编程中非常重要的工具,帮助我们更高效地处理和管理数据。
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"