Удаление обратного слэша 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 шт):

Автор решения: MarianD

Вам не нужно того, что вы сформулировали в вашем вопросе, просто сделайте

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+0080 Control Character - PADDING CHARACTER (PAD)
  • . . .
  • \x82 это Юникод U+0082 Control 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

Объяснение:

Строковые константы возможно писать в разных видах, для вас интересны эти:

  1. просто в кавычках или апострофах: "что-то",
  2. с буквой 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).

→ Ссылка
Автор решения: MarianD

Я подозреваю вас, что вы вашим вопросом совершили «Ошибку молотка» («Ошибку 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 кодировка оригинального текста).

→ Ссылка