Как заменить двойную обратную косую черту на одну обратную косую черту в python? - PullRequest
23 голосов
/ 19 июля 2011

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

(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...'

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

\\u201c

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

\u201c

Попытка 1:

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

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

Попытка 2:

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

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

Попытка 3:

fetched_page.decode('string_escape')

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

Ответы [ 6 ]

23 голосов
/ 19 июля 2011

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

11 голосов
/ 19 июля 2011

Я не получаю описанного вами поведения:

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

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

5 голосов
/ 19 июля 2011

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

2 голосов
/ 19 июля 2011

Это может быть немного излишним, но ...

>>> 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 при работе со строками (в отличие от байтовых объектов).

0 голосов
/ 28 апреля 2019

Python3:

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

или

>>> '\\u201c'.encode().decode('unicode_escape')
'“'
0 голосов
/ 19 июля 2011

Просто распечатайте это:

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