Исправить строку в юникоде, поврежденную (некоторыми) экранированными обратными косыми чертами - PullRequest
0 голосов
/ 06 мая 2018

Я смотрел на этот вопрос: python3 заменяет двойную обратную косую черту на одну обратную [двойную]

и просеять ответы на похожие вопросы: Python Replace \ with \ , Почему необработанные строковые литералы Python не заканчиваются одним обратным слешем? , Как мне убрать экранированную строку с юникодом в python?

Когда я понял, что ни один из ответов на самом деле не решил эту проблему. Скажем, у меня битая строка в Юникоде, она содержит и экранированные обратные слэши и экранирующие символы:

my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'

Когда я его печатаю, некоторые символы оценивают:

print(my_str)
\xa5\xc0\xe6aKù\x80\xb1\xc8*☺↕$\xfbp▲(4\xd6{;Z

Я могу вручную исправить это так:

my_str = repr(my_str)
my_str
"'\\\\xa5\\\\xc0\\\\xe6aKù\\\\x80\\\\xb1\\\\xc8*\\x01\\x12$\\\\xfbp\\x1e(4\\\\xd6{;Z'"
my_str = my_str.replace('\\\\','\\')
print(my_str)
'\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'

Но на этом этапе мне нужно вручную скопировать и вставить результат печати в переменную, чтобы завершить исправление:

my_str = '\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'
print(my_str)
¥ÀæaKù±È*☺↕$ûp▲(4Ö{;Z

Как мне это сделать без копирования и вставки?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Я упомянул ast.literal_eval в комментариях к принятому ответу. Но чувствую, что я должен включить фрагмент кода здесь:

Функция обратного воспроизведения в Python

from ast import literal_eval

my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
my_str = repr(my_str)
my_str = my_str.replace('\\\\','\\')
print(literal_eval(my_str))

Результат (Python 3):

¥ÀæaKù±È*☺↕$ûp▲(4Ö{;Z
0 голосов
/ 06 мая 2018

вырезать одинарные кавычки, кодировать, чтобы получить байты, а затем декодировать, используя «unicode-escape»:

# original code
my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
my_str = repr(my_str)
my_str = my_str.replace('\\\\','\\')
print(my_str)
# encode/decode stuff
print(my_str.strip("'").encode().decode("unicode-escape"))

печать:

'\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'
¥ÀæaKù±È*$ûp(4Ö{;Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...