Как использовать замену двойной обратной косой черты на одну для байтовой строки в Python - PullRequest
0 голосов
/ 06 июля 2018

Я хочу заменить двойную обратную косую черту на одну для байтовой строки в Python.

Например, есть строка байтов.

word = b'Z\xa6\x97\x86j2\x08q\\r\xca\xe6m'

Мне нужна эта строка байтов.

word = b'Z\xa6\x97\x86j2\x08q\r\xca\xe6m'

Если я использую заменить как:

word = word.replace(b"\\",b"\")

Я получил эту ошибку.

File "test.py", line 79
word = word.replace(b"\\", b"\")
                               ^
SyntaxError: EOL while scanning string literal

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

\\ - это не двойной обратный слеш, а один экранированный. Посмотрите:

print b'Z\xa6\x97\x86j2\x08q\\r\xca\xe6m'
# Z���jq\r��m

И \r (из желаемого результата) - это не 2 символа, а один:

print b'Z\xa6\x97\x86j2\x08q\r\xca\xe6m'
# ��m�jq

(при печати на терминал возврат каретки \r не дает нам увидеть первую букву Z)

Если вы действительно хотите заменить '\\r' на '\r', вы можете сделать:

print repr(word.replace('\\r', '\r'))
# 'Z\xa6\x97\x86j2\x08q\r\xca\xe6m'
print word.replace('\\r', '\r')
# ��m�jq

Или, если вы хотите заменить все escape-последовательности . Версия Python2:

print repr(b'1\\t2\\n3'.decode('string_escape'))
# '1\t2\n3'
print b'1\\t2\\n3'.decode('string_escape')
# 1 2
# 3

Python3 версия:

print(repr(b'1\\t2\\n3'.decode('unicode_escape')))
# '1\t2\n3'
print(b'1\\t2\\n3'.decode('unicode_escape'))
# 1 2
# 3
0 голосов
/ 06 июля 2018

ваш \r является символом возврата каретки. Так что \\r равно \ плюс возврат каретки. Вы не найдете \\ в вашей строке.

Что «работает», так это заменить обратную косую черту + CR на CR:

word = b'Z\xa6\x97\x86j2\x08q\\r\xca\xe6m'

print(word.replace(b"\\r",b"\r"))

результат:

b'Z\xa6\x97\x86j2\x08q\r\xca\xe6m'

но я не уверен, что это то, что вы имели в виду с самого начала (то есть вставка символа возврата каретки в строку байтов)

0 голосов
/ 06 июля 2018

У вас есть поток байтов. Вам нужно экранировать '\' и декодировать байты.

word = b'Z\xa6\x97\x86j2\x08q\\r\xca\xe6m'
new_word = (str(word).encode('utf-8'))
print(new_word.replace(b"\\\\",b"\\").decode('ascii'))
...