Удаление обратного слэша python
Есть строка:
s = "\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xb5\\xd1\\x82"
Нужно сделать её такой:
s = "\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"
Пробовал с помощью replace но результата нет.
s = "\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xb5\\xd1\\x82"
s = s.replace("\\\\", "\\")
Ответы (2 шт):
Вам не нужно того, что вы сформулировали в вашем вопросе, просто сделайте
s = "\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"
print(s)
чтобы вы в этом убедились — выводится чудесная строка
пÑивеÑ
Вам не нужна строка
"\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"
- (т.к. это строка из 12 символов:
\xd0,\xbf,\xd1, ...,\x82, представленных в виде экранированных последовательностей, 2 из них неизобразительные (\x80и\0x82)
а последовательность байтов
b"\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"
(см. мой другой ответ).
Применчание:
\xd0это ЮникодU+00D0Ð(LATIN CAPITAL LETTER ETH),\xbfэто ЮникодU+00BF¿(INVERTED QUESTION MARK),- . . .
\x80это ЮникодU+0080Control Character - PADDING CHARACTER (PAD)- . . .
\x82это ЮникодU+0082Control Character - BREAK PERMITTED HERE (BPH))
Но всё равно, я отвечу вам на ваш вопрос, как бы вы искренне хотели того, что вы написали:
Существует разница между тем,
- что вы в строке видите (
\\) и - тем, что в строке действительно находится (
\).
Примените функцию print():
s = "\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xb5\\xd1\\x82"
print(s)
\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82
Объяснение:
Строковые константы возможно писать в разных видах, для вас интересны эти:
- просто в кавычках или апострофах:
"что-то", - с буквой
rперед ними:r"что-то".
(Букваrзначит raw - сырая строка.)
Разница между ними только одна:
- в первом случае символ
\интерпретируется как начало экранированной последовательности (которая в итоге представляет собой только один символ) - а в другом случае нет — он будет дословно символом
\.
Примером экранированной последовательности может быть \n - она означает один (специальный) символ (переход на новую строку), хотя он написан как два символа: \ и n.
Подобным видом экранированная последовательность \\ обозначает один символ: \, хотя он написан как два символа: \ и \.
Значит, вашу строку — одну и ту же самую — возможно писать как
s = "\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xb5\\xd1\\x82"
или
s = r"\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"
В обоих случаях получите ту же самую строку (длины 48).
Я подозреваю вас, что вы вашим вопросом совершили «Ошибку молотка» («Ошибку XY»).
Точнее, вам не интересно, как из строки s сделать строку только с одними обратными слешми, вам нужно получить из ней строку "привет".
И так:
result = s.encode('latin1').decode('unicode_escape').encode('latin1').decode('utf8')
Примечание 1:
Уберите последнюю часть (.decode('utf8')) чтобы вы получили приблизительно то, что вы сформулировали в вашем вопросе - но не в виде строки, а в виде последовательности байтов:
b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
Примечание 2:
Этa последняя часть (.decode('utf8')) бы была достаточной, когда бы не было первичной ошибки - метода, которым вы получили вашу оригинальную строку s:
Вы читали файл в текстовом, а не в бинарном режиме.
Когда бы вы его читали в бинарном режиме, вы бы получили последовательность байтов
p = b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
и нужно бы было сделать только последний шаг: p.decode("utf8").
Обяснение:
- Строки возможно только кодировать (в последовательность байтов)
(например для переноса в другой компьютер через сеть). - Последовательности байтов возможно только декодировать (в строки)
(например после получение другим компьютером через сеть.)
Поэтому цепочка повторного кодирования и декодирования.
Сначала нужно вашу строку закодировать в байтовую последовательность кодеком лatin-1, чтобы было возможно применить декодировку unicode_escape - см. Text Encodings.
Но и результат нужно опять кодировать, чтобы эго было возможно декодировать как UTF-8 (потому, что UTF-8 кодировка оригинального текста).