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.
Tu peux essayer codecs.escape_decode
, cela devrait décoder les séquences d'échappement.
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 print
essayer les valeurs réelles, au lieu de regarder uniquement comment REPL les affiche.
Python3:
>>> b'\\u201c'.decode('unicode_escape')
'“'
ou
>>> '\\u201c'.encode().decode('unicode_escape')
'“'
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.
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.