web-dev-qa-db-fra.com

Supprimer tous les caractères hexadécimaux de la chaîne en Python

Bien qu'il y ait des questions similaires, je ne semble pas pouvoir trouver de solution satisfaisante à mon cas:

Je rencontre des caractères hexagonaux agaçants dans des chaînes, par exemple.

'\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'

Ce dont j'ai besoin, c'est de supprimer ces caractères \xHH hexadécimaux, et les seuls, afin d'obtenir le résultat suivant:

'http://www.google.com blah blah#%#@$^blah'

le décodage n'aide pas:

s.decode('utf8') # u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'

Comment puis-je y arriver?

7
Kludge

Supprimez simplement tous les caractères non-ASCII:

>>> s.decode('utf8').encode('ascii', errors='ignore')
'http://www.google.com blah blah#%#@$^blah'

Autre solution possible: 

>>> import string
>>> s = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
'http://www.google.com blah blah#%#@$^blah'

Ou utilisez des expressions régulières:

>>> import re
>>> re.sub(r'[^\x00-\x7f]',r'', s) 
'http://www.google.com blah blah#%#@$^blah'

Choisissez votre préféré.

14
Magnun Leno

Ce ne sont pas des "caractères hexadécimaux", mais la représentation interne (codée en utf-8 dans le premier cas, point de code unicode dans le deuxième cas) des caractères unicode "GAUCHE DOUBLE COTATION" ("") et "MARQUE DOUBLE COTATION DROITE '(' ''). 

>>> s = "\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah"
>>> print s
“http://www.google.com” blah blah#%#@$^blah
>>> s.decode("utf-8")
u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'
>>> print s.decode("utf-8")
“http://www.google.com” blah blah#%#@$^blah

Pour les supprimer, ce ne sont que des caractères ordinaires. Une simple str.replace() suffira:

>>> s.replace("\xe2\x80\x9c", "").replace("\xe2\x80\x9d", "")
'http://www.google.com blah blah#%#@$^blah'

Si vous voulez vous débarrasser de tous les caractères non-ascii à la fois, il vous suffit de décoder en unicode, puis d'encoder en ascii avec le paramètre "ignore":

>>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'
5

Vous pouvez lui demander de vérifier la validité des lettres et, au lieu de tout saisir, il est possible d'utiliser le module string. Ceux qui peuvent vous être utiles sont string.ascii_letters (contient à la fois string.ascii_lowercase et string.ascii_uppercase), string.digits, string.printable et string.punctuation.

J'essaierais d'abord string.printable, mais si cela laisse passer un trop grand nombre de caractères, vous pouvez utiliser un mélange des autres.

Voici un exemple de comment je le ferais:

import string
valid_characters = string.printable
start_string = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
end_string = ''.join(i for i in start_string if i in valid_characters)
2
Peter

Vous pouvez utiliser le décodage après le codage comme ceci

s.encode('ascii', errors='ignore').decode("utf-8")
0
Manthan Koolwal