2013-04-17 10 views
7

Uso un tokenizer per dividere frasi francesi in parole e ha avuto problemi con le parole che contengono il carattere francese â.Python estremamente enigmatico regex comportamento unicode

ho cercato di isolare il problema e alla fine si riduceva a questo semplice fatto:

>>> re.match(r"’", u'â', re.U) 
>>> re.match(r"[’]", u'â', re.U) 
<_sre.SRE_Match object at 0x21d41d0> 

â corrisponde un modello contenente se è messo in un matcher insieme.

C'è qualcosa di sbagliato nella gestione di UTF-8 o si tratta di un bug?

La mia versione pitone è:

Python 2.7.3 (default, Jan 2 2013, 13:56:14) 
[GCC 4.7.2] on linux2 

EDIT:

Hum, abbastanza embarassingly, sembra che la sostituzione del r anteponendo il pattern con un u risolve il problema.

mi chiedo perché la documentazione ufficiale utilizza ampiamente r poi :((

+0

'r' è corretto e importante. Dovresti ** aggiungere ** 'u' (vedi la risposta) invece di sostituire' r'. –

+0

@ m.buettner: sì ho modificato prima di vedere la risposta. Sono andato avanti e ho controllato cosa 'r' e' u' fare, e in effetti entrambi sono importanti. Grazie :) – m09

risposta

7

vostro modello dovrebbe essere una stringa unicode troppo:

>>> re.match(ur"’", u'â', re.U) 
>>> re.match(ur"[’]", u'â', re.U) 

Altrimenti apparentemente sre codifica â al latin-1 e trova il byte con conseguente i tre byte che è un utf-8 .

"[’]" è equivalente a "[\xe2\x80\x99]", e u'â'.encode('latin-1') è \xe2.

+0

grazie per il suggerimento, l'ho notato poco prima che tu rispondessi :) – m09

+0

're.U' non si accende magicamente su unicode, cambia solo il significato di' \ w'. –