5 votes

python3 remplace la double barre oblique inverse par une barre oblique inverse simple

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'

4voto

Blownhither Ma Points 1206

Examinez de plus près la chaîne de caractères, ils sont tous constitués d'une seule barre oblique.

In [26]: my_str[0]
Out[26]: '\\'

In [27]: my_str[1]
Out[27]: 'x'

In [28]: len(my_str[0])
Out[28]: 1

Et my_str.replace('\\','\') ne fonctionnera pas parce que le jeton ici est \' qui s'échappe ' et attend une autre fermeture ' .
Utilisation my_str.replace('\\', '') au lieu de


Mise à jour : après quelques jours supplémentaires, je me rends compte que la discussion suivante peut également être utile. Si l'intension d'une chaîne de caractères avec échappement ( '\\x' o '\\u' ) sont finalement des littéraux hexa/unicode, ils peuvent être décodés par escape_decode .

import codecs
print(len(b'\x32'), b'\x32')                # 1 hex literal, '\x32' == '2'
print(len(b'\\x32'), b'\\x32')              # 4 chars including escapes
print(codecs.escape_decode('\\x32', 'hex')) # chars->literal, 4->1

# 1 b'2'
# 4 b'\\x32'
# (b'2', 4)

s = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
ed, _ = codecs.escape_decode(s, 'hex')
print(len(s), s)
print(len(ed), ed)

# 49 \xa5\xc0\xe6aK\xf9\x80\xb1\xc8*$\xfbp(4\xd6{;Z
# 22 b'\xa5\xc0\xe6aK\xf9\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'

1voto

Patrick Artner Points 29630

Si vous le faites

s  = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'

s = s.replace('\\','\')

print(s)

vous obtenez

 File "main.py", line 3
    s = s.replace('\\','\')
                         ^
SyntaxError: EOL while scanning string literal

parce qu'en '\' l'\n- s'échappe de la ' . Votre corde est laissée ouverte.

Vous n'avez pas de double emploi dans s - c'est juste affichage en tant que tel, le distinguent de \ utilisé pour échapper à des choses si vous l'inspectez.

Si vous print(s) vous obtenez \xa5\xc0\xe6aK\xf9\x80\xb1\xc8*$\xfbp(4\xd6{;Z\x

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X