Je dois remplacer \\
con \
en python3 dans une chaîne complexe. Je sais que cette question a été posée plusieurs fois, mais la plupart du temps pour des chaînes simples, de sorte qu'aucune des réponses (acceptées) ne fonctionne vraiment pour des chaînes complexes.
Il s'agit également différents de celui-ci où le problème pourrait être résolu par .decode('unicode_escape')
qui ne fonctionne pas pour ce problème. Voir ci-dessous .
En supposant que la chaîne soit :
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
L'approche directe serait la suivante :
my_str.replace('\\','\')
ce qui conduit à :
Erreur de syntaxe : EOL lors de l'analyse d'une chaîne littérale
Le présent répondre suggère d'utiliser :
my_str.replace('\\\\','\\')
Ce qui se traduit par :
'\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Il n'y a donc pas de changement.
Le présent répondre suggère :
b = bytes(my_str, encoding='utf-8')
b.decode('unicode-escape')
Mais cela ne fonctionne pas pour une chaîne aussi complexe :
UnicodeDecodeError : le codec 'unicodeescape' ne peut pas décoder les octets en position 49-50 : tronqués \xXX s'échapper
En utilisant le décodage (comme suggéré aquí ) se traduit par :
my_str.decode('unicode_escape')
AttributeError : l'objet 'my_str' n'a pas d'attribut 'decode'
Une combinaison d'encodage et de décodage à l'aide de unicode_esacpe
renvoie une chaîne totalement différente (probablement en raison de l'utilisation de utf-16
mais utf-8
entraîne une erreur, voir ci-dessus. De même, par exemple latin1
ne fonctionne pas) :
my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'