Замена \\ на \ в Python
Всем привет! Если вопрос глупый, заранее извините. В поиске ничего не нашел.
Есть 2 переменные:
x1 = '\u0421\u0415\u041a\u0420\u0415\u0422'
x2 = '\\u0421\\u0415\\u041a\\u0420\\u0415\\u0422'
print(x1) #СЕКРЕТ
print(x2) #\u0421\u0415\u041a\u0420\u0415\u0422
В первом случае все работает отлично. Но в моей функции переменная x2 получает строку со значением
'\\u0421\\u0415\\u041a\\u0420\\u0415\\u0422'
Как мне x2 привести к виду x1? Да, напрашиваются очевидные вещи вроде
x3 = x2.replace("\\\\", "\\")
Но они ведут к такому же результату:
print(x3) #\u0421\u0415\u041a\u0420\u0415\u0422
Ответы (4 шт):
Ответ для первоначального вопроса, в котором было
x2 = '\\\u0421\\\u0415\\\u041a\\\u0420\\\u0415\\\u0422':
x3 = x2.replace('\\', '')
Объяснение:
x1 = '\u0421\u0415\u041a\u0420\u0415\u0422'
Значение переменной x1 состоит из 6 знаков, выраженных в коде Юникод как
\u0421, \u0415, \u041a, \u0420, \u0415, \u0422:
>>> print(x1)
СЕКРЕТ
Теперь x2:
x2 = '\\\u0421\\\u0415\\\u041a\\\u0420\\\u0415\\\u0422'
Так как "\\" интерпретируется как один знак \, x2 состоит из 12 знаков:
\, \u0421, \, \u0415, \, \u041a, \, \u0420, \, \u0415, \, \u0422:
>>> print(x2)
\С\Е\К\Р\Е\Т
Видимо, нужно только удалить все знаки \, например заменой всякого знака \ на пустую строку.
Так как
- строку с одним знаком
\нужно в Питоне писать как'\\', - пустую строку как
''
команда будет такой, как я написал в начале моего ответа.
Ответ для первоначального вопроса, в котором было
x2 = '\\\u0421\\\u0415\\\u041a\\\u0420\\\u0415\\\u0422':
Возможно применить метод translate() (и возможно стандартную функцию ord()) для удаления всех знаков \:
x3 = x2.translate({ord("\\"): None})
или просто
x3 = x2.translate({92: None})
потому что ord("\\") == 92 (читай: Юникод номер знака \ равен 92).
Параметр метода translate() это так называема переводная таблица. В нашем простом случае мы используем словарь с одним элементом — значение None для ключа 92 поручает удалить все знаки с Юникод номером 92, т.е. все знаки \.
Ну, если последняя правка верна, то так можно:
print(''.join(chr(int(x, 16)) for x in x2.split('\\u') if x))
# СЕКРЕТ
То есть убираем все \u, а то, что между ними, переводим из 16-ричного вида в обычное число и потом в символ с таким кодом.
Ответ для текущего, т.е. измененного вопроса:
x2.encode().decode('unicode_escape')
Объясню после подтверждения, что суть вашего вопроса уже не будет изменена. ?
Объяснение:
Смотря на последовательность знаков в вашей строке, вижу, что она как будто приехала на ваш компьютер из другого компьютера (может быть, из сервера на Интернете):
Почему?
Потому что это знакомый образец одной из кодировок символов (напр. букв) в последовательность байтов, так называема «екранированный Юникод» (Unicode escape).
Зачем кодировка?
Потому что дорожка от компьютера до компьютера очень узка — данные могут ее проходить только байт за байтом.
Но байт может содержать только 256 разных значений — очень мало для букв и символов всех языков мира! И так, большинство символов нужно заменить последовательностей двух, трех и иногда и более байтов. Другими словами, отдельные символы нужно кодировать.
После пути к вашему компьютеру нужно последовательность байтов декодировать.
Как была последовательность байтов декодирована в вашем компьютере?
Плохо. Байт за байтом: \, затем u, затем 0, затем 4, и тд. (Как будто никак, более точно, как последовательность ASCII символов, т.к. байт просто целое число от 0 до 255).
Вы получили строку 36 «американских» символов вместо 6 символов «наших».
(Между апострофами или кавычками нужно в Питоне один символ \ записать как пару \\, но всё равно это только форма записи одного \.)
Что с этим делать?
Как будто приготовить их обратно к отправлению на другой компютер - закодировать их обратно в байты:
x2.encode() # примениться стандартный кодер utf_8, пригодный тоже для ASCII
но никуда их не посылаем — наоборот, делаем вид, что мы их только что приняли из другого компьютера:
На результат
x2.encode()типаbytes...... мы применим на этот раз правильный декодер
'unicode_escape':x2.encode() .decode('unicode_escape')чтобы получит строку
"СЕКРЕТ"типаstr.
Примечания:
Кодер / декодер, символы / байты, тип
str/ типbytes- В направлении от компьютера применяется кодер, который превращает символы в последовательность байтов (тип
str⇾ типbytes), - в направлении в компьютер применяется декодер, который превращает последовательность байтов в символы (тип
bytes⇾ типstr)
- В направлении от компьютера применяется кодер, который превращает символы в последовательность байтов (тип
Исчерпывающее руководство по Юникоду и кодировке символов в Python.



