Nic*_*ick 89 python string escaping
假设我有一个字符串,它是另一个字符串的反斜杠转义版本.在Python中,有一种简单的方法可以解除字符串的问题吗?例如,我可以这样做:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Run Code Online (Sandbox Code Playgroud)
但是,这涉及将(可能不受信任的)字符串传递给eval(),这是一个安全风险.标准库中是否有一个函数,它接受一个字符串并产生一个没有安全隐患的字符串?
Chr*_*heD 129
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
Run Code Online (Sandbox Code Playgroud)
jat*_*ism 32
你可以使用ast.literal_eval
哪个是安全的:
安全地评估表达式节点或包含Python表达式的字符串.提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None.(结束)
像这样:
>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
Run Code Online (Sandbox Code Playgroud)
Jan*_*der 21
对于 Python3,请考虑:
my_string.encode('raw_unicode_escape').decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)
“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
asa*_*ica 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"
Run Code Online (Sandbox Code Playgroud)
Jes*_*ain 11
所有给出的答案将在通用Unicode字符串上中断。据我所知,以下代码在所有情况下都适用于Python3:
from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)
Run Code Online (Sandbox Code Playgroud)