Ответ 1
Вы можете попробовать codecs.escape_decode
, это должно декодировать escape-последовательности.
У меня есть строка. В этой строке есть двойная обратная косая черта. Я хочу заменить двойные обратные косые черты одиночными обратными косыми чертами, так что коды юникода 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')
Но это не повлияло на текст. Все двойные обратные косые черты остались как двойные обратные косые черты.
Вы можете попробовать codecs.escape_decode
, это должно декодировать escape-последовательности.
Я не получаю описание, которое вы описываете:
>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\
Когда вы видите '\\\\'
в своем выводе, вы видите вдвое больше черт, чем в строке, потому что каждый из них экранирован. Код, который вы написали, должен работать нормально. Попытка print
вывести фактические значения, а не только посмотреть, как их отображает REPL.
Чтобы ответить на вопрос Джереми, ваша проблема в том, что '\'
является незаконной строкой, потому что \'
скрывает метку кавычки, поэтому ваша строка никогда не заканчивается.
Это может быть немного перебор, но...
>>> 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
при работе со строками (в отличие от объектов байтов).
python3:
>>> b'\\u201c'.decode('unicode_escape')
'"'
или же
>>> '\\u201c'.encode().decode('unicode_escape')
'"'
Просто напечатайте его:
>>> a = '\\u201c'
>>> print a
\u201c