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

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)

  • 基本上对于Python3你想要'print(b"Hello,\nworld!".decode('unicode_escape'))` (23认同)
  • 有没有与python 3兼容的东西? (8认同)
  • **警告:**`value.encode('utf-8')。decode('unicode_escape')`[损坏字符串中的非ASCII字符](https://bugs.python.org/issue21331)。除非保证输入中仅包含ASCII字符,否则这不是有效的解决方案。 (4认同)
  • 对于python 3,使用`value.encode('utf-8')。decode('unicode_escape')` (3认同)
  • @ thejinx0r:在这里看看:http://stackoverflow.com/questions/14820429/how-do-i-decodestring-escape-in​​-python3 (2认同)

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)

  • 在字符串中使用转义的分号会破坏此代码.引发语法错误"行后续字符后的意外字符" (3认同)
  • @darksky注意到`ast`库需要在escaped_str周围引用引号(或者```或```,甚至``""或``'`),因为它实际上是试图将它作为Python代码运行但是增强了安全性(防止字符串注入) (3认同)

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)

  • 如果字符串包含一些utf-8非ascii字符(即波兰字符),这将令人难以置信 (5认同)
  • 把它放在一起,`value.encode('utf-8').decode('unicode_escape')`. (2认同)

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)