web-dev-qa-db-fra.com

Comment remplacer une double barre oblique inverse par une simple barre oblique inverse en python?

J'ai une chaîne. Dans cette chaîne se trouvent des doubles barres obliques inverses. Je veux remplacer les doubles barres obliques inverses par des barres obliques inverses simples, afin que les codes de caractères unicode puissent être analysés correctement.

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

À l'intérieur de cette chaîne, vous pouvez voir les codes de caractères Unicode échappés, tels que:

\\u201c

Je veux transformer ceci en:

\u201c

Tentative 1:

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

mais cela ne fonctionne pas - il recherche des barres obliques inverses quadruples.

Tentative 2:

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

Mais cela se traduit par une erreur de fin de ligne.

Tentative 3:

fetched_page.decode('string_escape')

Mais cela n'a eu aucun effet sur le texte. Tous les doubles contre-obliques sont restés comme doubles contre-obliques.

25
zzz

Tu peux essayer codecs.escape_decode, cela devrait décoder les séquences d'échappement.

24
schlamar

Je n'obtiens pas le comportement que vous décrivez:

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

Quand tu vois '\\\\' dans votre sortie, vous voyez deux fois plus de barres obliques qu'il y en a dans la chaîne car chaque on est échappé. Le code que vous avez écrit devrait fonctionner correctement. Essayer printessayer les valeurs réelles, au lieu de regarder uniquement comment REPL les affiche.

12
Jeremy Banks

Python3:

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

ou

>>> '\\u201c'.encode().decode('unicode_escape')
'“'
6
max5555

Pour prolonger la réponse de Jeremy, votre problème est que '\' est une chaîne illégale car \' échappe le guillemet, donc votre chaîne ne se termine jamais.

5
murgatroid99

C'est peut-être un peu exagéré, mais ...

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

Alors oui, la solution la plus simple serait la réponse de ms4py, en appelant codecs.escape_decode sur la chaîne et en prenant le résultat (ou le premier élément du résultat si escape_decode renvoie un Tuple comme il semble dans Python 3). Dans Python 3 vous souhaitez utiliser codecs.unicode_escape_decode quand on travaille avec des chaînes (par opposition aux objets octets), cependant.

3
JAB