2009-08-25 2 views
4

Hallo, ich habe ein Problem in Python. Ich versuche mein Problem mit einem Beispiel zu erklären.Python - Probleme mit regulären Ausdruck und Unicode

Ich habe diese Saite:

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

und ich möchte zum Beispiel charachters ersetzen verschieden von n, A, ï mit ""

Ich habe versucht:

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

Ich habe dieses erhalten. Ich denke, dass es passiert, weil diese Art von Zeichen in Python durch zwei Positionen im Vektor dargestellt werden: zum Beispiel \ xc3 \ x91 = Ñ. Dafür, wenn ich den Regolar Ausdruck mache, sind alle \ xc3 nicht ersetzt. Wie kann ich diese Art von Sub ?????

Dank Franco

Antwort

14

Sie müssen sicherstellen, dass Ihre Strings Unicode-Strings sind, nicht blanke Saiten (plain Strings wie Byte-Arrays sind).

Beispiel:

>>> 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) 
à 

Wenn aus einer Datei zu lesen, string = open('filename.txt').read() liest eine Byte-Reihenfolge.

Um den Unicode-Inhalt zu erhalten, tun Sie: string = unicode(open('filename.txt').read(), 'encoding'). Oder: string = open('filename.txt').read().decode('encoding').

Das Modul codecs kann Unicode-Streams (z. B. Dateien) während der Übertragung decodieren.

Machen Sie eine Google-Suche nach python unicode. Die Handhabung von Python-Unicode kann anfangs etwas schwierig sein, es lohnt sich, darüber zu lesen.

Ich lebe nach dieser Regel: "Software sollte nur mit Unicode-Zeichenfolgen intern arbeiten, Umwandlung in eine bestimmte Codierung für die Ausgabe." (von http://www.amk.ca/python/howto/unicode)

Ich empfehle auch: http://www.joelonsoftware.com/articles/Unicode.html