Как заменить двойную обратную косую черту на одну обратную косую черту в python?

У меня есть строка. В этой строке есть двойная обратная косая черта. Я хочу заменить двойные обратные косые черты одиночными обратными косыми чертами, так что коды юникода char могут быть правильно проанализированы.

(Pdb) p fetched_page
'<p style="text-align:center;" align="center"><strong><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0<\\/span><\\/strong><\\/p>\n<p><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0 in \\u201cDreaming in Code\\u201d give a brief description of programming in its early years and how and why programmers are still struggling today...'

Внутри этой строки вы можете увидеть escape-коды символов юникода, например:

\\u201c

Я хочу превратить это в:

\u201c

Попытка 1:

fetched_page.replace('\\\\', '\\')

но это не сработает - он ищет четырехкратную обратную косую черту.

Попытка 2:

fetched_page.replace('\\', '\')

Но это приводит к ошибке конца строки.

Попытка 3:

fetched_page.decode('string_escape')

Но это не повлияло на текст. Все двойные обратные косые черты остались как двойные обратные косые черты.

Ответы

Ответ 1

Вы можете попробовать codecs.escape_decode, это должно декодировать escape-последовательности.

Ответ 2

Я не получаю описание, которое вы описываете:

>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\

Когда вы видите '\\\\' в своем выводе, вы видите вдвое больше черт, чем в строке, потому что каждый из них экранирован. Код, который вы написали, должен работать нормально. Попытка print вывести фактические значения, а не только посмотреть, как их отображает REPL.

Ответ 3

Чтобы ответить на вопрос Джереми, ваша проблема в том, что '\' является незаконной строкой, потому что \' скрывает метку кавычки, поэтому ваша строка никогда не заканчивается.

Ответ 4

Это может быть немного перебор, но...

>>> import re
>>> a = '\\u201c\\u3012'
>>> re.sub(r'\\u[0-9a-fA-F]{4}', lambda x:eval('"' + x.group() + '"'), a)
'"〒'

Итак, самое простое решение ответит на ms4py, вызывая codecs.escape_decode в строке и принимая результат (или первый элемент результата, если escape_decode возвращает кортеж, как кажется на Python 3). В Python 3 вы хотите использовать codecs.unicode_escape_decode при работе со строками (в отличие от объектов байтов).

Ответ 5

python3:

>>> b'\\u201c'.decode('unicode_escape')
'"'

или же

>>> '\\u201c'.encode().decode('unicode_escape')
'"'

Ответ 6

Просто напечатайте его:

>>> a = '\\u201c'
>>> print a
\u201c