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?
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é.
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'
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)
Vous pouvez utiliser le décodage après le codage comme ceci
s.encode('ascii', errors='ignore').decode("utf-8")