Предположим, у меня есть строка, которая является версией другой строки с экранированной обратной косой чертой. Есть ли простой способ в Python отменить экранирование строки? Я мог бы, например, сделать:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Однако это предполагает передачу (возможно, ненадежной) строки в eval (), что представляет угрозу безопасности. Есть ли в стандартной библиотеке функция, которая принимает строку и производит строку без последствий для безопасности?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
повреждает не-ASCII символы в строке . Это недопустимое решение, если только вводимые данные не содержат только символы ASCII.Вы можете использовать то,
ast.literal_eval
что безопасно:Как это:
источник
ast
библиотека требует кавычек (либо"
или'
, даже,"""
либо'''
) вокруг вашего escaped_str, поскольку на самом деле он пытается запустить его как код Python, но повышает безопасность (предотвращает внедрение строк)str
этоrepr
изstr
илиbytes
объекта , как в случае с ФП в;unicode-escape
кодек ответ, когда это неrepr
, но некоторые другие формы сбежавшего текста (не заключены в кавычках как часть самой строки данных).[ERROR] TypeError: string indices must be integers
и это решение помогло решить эту проблему. Отмените экранирование строки, затем проанализируйте как JSON.Все данные ответы будут разбиты на общие строки Unicode. Насколько я могу судить, для Python3 во всех случаях работает следующее:
Как указано в комментариях, вы также можете использовать
literal_eval
метод изast
модуля следующим образом:Или вот так, когда ваша строка действительно содержит строковый литерал (включая кавычки):
Однако, если вы не уверены, используются ли во входной строке двойные или одинарные кавычки в качестве разделителей, или когда вы не можете предположить, что она вообще экранирована должным образом, тогда
literal_eval
может некотороеSyntaxError
время повышаться, пока метод кодирования / декодирования все равно будет работать.источник
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
у меня отлично работает с Python 3.7.3В Python 3 у
str
объектов нетdecode
метода, и вы должны использоватьbytes
объект. Ответ ChristopheD касается python 2.источник
value.encode('utf-8').decode('unicode_escape')
.encode
?