Во-первых, есть "string_escape"
и "unicode_escape"
, либо они не могут декодировать заданную вами строку. Первый читает строку байтов, экранированную как строку байтов, и декодирует ее как строку байтов. Вторая читает строку Unicode, экранированную и сохраненную в байтовой строке, поэтому она не может прочитать входные объекты Unicode, по крайней мере те, которые содержат символы Unicode в них.
Я считаю, что приведенная здесь необработанная строка неверна, и вы действительно хотите s.decode('unicode_escape')
для реальных строк, исходящих из вашего источника.
Если я ошибаюсь, лучшее, что вы можете сделать, это вручную экранировать любые неэкранированные одинарные кавычки с помощью re
, поместить дополнительные одинарные кавычки вокруг него и использовать ast.literal_eval
.
def substitute(match):
if len(match.group(1)) % 2 == 1:
return match.group()
else:
return ur"%s\%s" % (match.group(1), match.group(2))
ast.literal_eval("'%s'" % re.sub(ur"(\\+)(')", substitute, s))
Третий вариант - передать строку на ast.literal_eval
без дополнительной работы с вашей стороны. Какой из этих трех параметров зависит от того, что именно у вас есть в виде строки.
У меня есть еще одно подозрение, что это может быть объект JSON. Вы должны привести пример строки, которую вы получаете, и откуда вы ее получаете и как.