2009-08-25 9 views
4

Bonjour, j'ai un problème avec python. J'essaie d'expliquer mon problème avec un exemple.python - problèmes avec l'expression régulière et unicode

J'ai cette chaîne:

>>> string = 'ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂÃ' 
>>> print string 
ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂà 

et je veux, par exemple, remplacer charachters différents de Ñ, à, ï avec ""

j'ai essayé:

>>> rePat = re.compile('[^ÑÃï]',re.UNICODE) 
>>> print rePat.sub("",string) 
������������������������������������������������à 

J'ai obtenu ce . Je pense que c'est parce que ce type de caractères en python est représenté par deux positions dans le vecteur: par exemple \ xc3 \ x91 = Ñ. Pour cela, quand je fais l'expression regolar, tous les \ xc3 ne sont pas substitués. Comment je peux faire ce type de sous ?????

Merci Franco

Répondre

14

Vous devez vous assurer que vos chaînes sont des chaînes unicode, non des chaînes simples (chaînes simples sont comme des tableaux d'octets).

Exemple:

>>> string = 'ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂÃ' 
>>> type(string) 
<type 'str'> 

# do this instead: 
# (note the u in front of the ', this marks the character sequence as a unicode literal) 
>>> string = u'\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\xc0\xc1\xc2\xc3' 
# or: 
>>> string = 'ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂÃ'.decode('utf-8') 
# ... but be aware that the latter will only work if the terminal (or source file) has utf-8 encoding 
# ... it is a best practice to use the \xNN form in unicode literals, as in the first example 

>>> type(string) 
<type 'unicode'> 
>>> print string 
ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂà 

>>> rePat = re.compile(u'[^\xc3\x91\xc3\x83\xc3\xaf]',re.UNICODE) 
>>> print rePat.sub("", string) 
à 

Lors de la lecture d'un fichier, string = open('filename.txt').read() lit une séquence d'octets.

Pour obtenir le contenu unicode, faites: string = unicode(open('filename.txt').read(), 'encoding'). Ou: string = open('filename.txt').read().decode('encoding').

Le module codecs peut décoder des flux Unicode (tels que des fichiers) à la volée.

Effectuez une recherche google pour python unicode. La manipulation de Python Unicode peut être un peu difficile à comprendre au début, il est utile de lire dessus. Je vis selon cette règle: "Le logiciel ne devrait fonctionner qu'avec les chaînes Unicode en interne, en convertissant un encodage particulier en sortie." Je recommande également: http://www.joelonsoftware.com/articles/Unicode.html