2012-05-07 14 views
6

Qualcuno potrebbe spiegarmi questo strano comportamento? Mi aspetterei che entrambi i metodi di sostituzione funzionino o meno allo stesso tempo. Sono solo io o c'è qualcuno che non lo trova coerente?Comportamento strano di re.sub con stringhe utf-8

>>> u'è'.replace("\xe0","") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) 
>>> re.sub(u'è','\xe0','',flags=re.UNICODE) 
'' 

(Si prega di notare che io non sto chiedendo una spiegazione del perché u'è'.replace ("\ xe0", "") genera un errore!)

+0

'unicode.replace' non è lo stesso metodo di' re.sub'. – Daenyth

+0

Ovviamente. E il mio punto è che dovrebbero comportarsi in modo coerente per gli stessi input. – luke14free

+1

Sono domande come queste che hanno portato all'applicazione più rigorosa delle stringhe Unicode e Byte in Python 3. –

risposta

2

Da Unicode Doc

gli argomenti per questi metodi possono essere stringhe Unicode o stringhe 8 bit. Le stringhe a 8 bit verranno convertite in Unicode prima di trasportare l'operazione ; codifica ASCII predefinito di pitone verrà utilizzata, in modo caratteri superiori a 127 causerà un'eccezione

Da Re Doc:

Questo modulo fornisce espressioni regolari operazioni corrispondenti simili a quelli trovati in Perl. Entrambi i modelli e le stringhe da cercare possono essere stringhe Unicode e stringhe a 8 bit.

Poiché per il modulo Re non si specifica esplicitamente il flag Unicode, non sta tentando la conversione e quindi non genera l'errore. Ecco perché non si comportano in modo coerente

+0

Mhh. Non troppo convinto della cosa della bandiera; >>> re.sub (u'è ',' \ xe0 ',' ', flags = re.UNICODE) mi restituisce ancora' ' – luke14free

+0

È perfettamente possibile che il modulo re rilevi tale eccezione e non sia trasparente a riguardo, solo un'intuizione, non confermata. – subiet

+1

Non ha funzionato per me :(Python è assolutamente orribile con il supporto Unicode. Ho sprecato 3 giorni e ancora non ho potuto terminare una semplice funzione di cambio di lettura-scrittura. – oriadam

0

Python 2.X ha una gestione un po 'innaturale della codifica, che richiede la conversione implicita. Proverà a giocare con stringhe unicode e no-unicode, quando la conversione non viene gestita dall'utente. Alla fine, questo non risolve il problema: la codifica deve essere riconosciuta dallo sviluppatore fin dall'inizio. Python 2 rende solo le cose meno esplicite e un po 'meno ovvie.

Questo è il tuo esempio originale, tranne, in particolare ho detto a Python che tutte le stringhe erano unicode. Se non lo fai, Python proverà a convertirli. E poiché la codifica predefinita in Python 2 è ASCII, questo ovviamente fallirà con il tuo esempio.

La codifica è un argomento delicato, ma con alcune buone abitudini (come la conversione anticipata, essendo sempre sicuro di quale tipo di dati viene gestito dal programma in un determinato punto), di solito (e insisto, in modo usuale) va bene .

Spero che questo aiuti!