Как мне отменить экранирование строки с обратной косой чертой в python?


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

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

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

3 74

3 ответа:

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

можно использовать ast.literal_eval что безопасно:

безопасно вычислить узел выражения или строку, содержащую Python выражение. Предоставленная строка или узел могут состоять только из после питона буквальном структур: строки, числа, кортежи, списки, предсказывает, логические, и никто. (Конец)

такой:

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

в python 3,str объекты не имеют decode метод, и вы должны использовать bytes "объект". Ответ кристофеда охватывает 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"