Как избежать обратной косой черты?

Предположим, что у меня есть строка, которая является версией другой строки с экранированным обратным слэшем. Есть ли простой способ в Python для отмены строки? Я мог бы, например, сделать:

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

Однако это предполагает передачу (возможно, ненадежной) строки в eval(), которая представляет собой угрозу безопасности. Есть ли функция в стандартной библиотеке lib, которая берет строку и создает строку без каких-либо последствий для безопасности?

Ответ 1

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

Ответ 2

Вы можете использовать ast.literal_eval, который безопасен:

Безопасно оценить выражение node или строку, содержащую Python выражение. Строка или node предоставляется может состоять только из следующие литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans и None. (END)

Вот так:

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

Ответ 3

В 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"

Ответ 4

Все приведенные ответы будут разбиты на общие строки Unicode. Насколько я могу судить, Python3 работает во всех случаях:

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