2013-04-17 15 views
7

Używam tokenizera do dzielenia zdań francuskich na słowa i miałem problemy ze słowami zawierającymi francuski znak â.Python niezmiernie zaskakujący zachowanie unicode regex

Starałem się wyizolować problem i ostatecznie sprowadza się do tego prostego faktu:

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

â towarzyszą wzorca zawierającego jeśli to umieścić w zespole dopasowującego.

Czy jest coś złego z mojej strony w zakresie obsługi UTF-8 lub czy jest to błąd?

Moja wersja Pythona:

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

EDIT:

Hum, wystarczy embarassingly, wydaje się, że zastąpienie r poprzedzając wzór z u rozwiązuje problem.

Zastanawiam się, dlaczego oficjalna dokumentacja wykorzystuje szeroko r następnie :((

+0

'r' jest poprawne i ważne. Powinieneś ** dodać ** 'u' (zobacz odpowiedź) zamiast zamieniać' r'. –

+0

@ m.buettner: Yup Edytowałem przed zobaczeniem odpowiedzi. Poszedłem dalej i sprawdziłem, co robią "r" i "u", a tak naprawdę oba są ważne. Dzięki :) – m09

Odpowiedz

7

Twój wzór powinien być ciągiem unicode też:

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

Inaczej najwyraźniej sre koduje â do Latin-1 i stwierdza wynikowy bajt trzy bajty, które są utf-8 .

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

+0

dzięki za podpowiedź, zauważyłem to tuż przed odpowiedzią :) – m09

+0

're.U' nie magicznie włącza unicode, po prostu zmienia znaczenie' \ w'. –