2013-04-17 5 views
7

私はフレーズを単語に分割するためにトークナイザを使用し、フランス語文字âを含む単語に問題がありました。Pythonは非常に困惑している正規表現ユニコードの動作

私は、問題を特定しようとしましたが、それは最終的に、この単純な事実に煮詰め:それはアンサンブルマッチャーに入れています場合

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

âを含むパターンにマッチしています。

UTF-8処理に関する私のところに何か問題がありますか、それともバグですか?

私のPythonのバージョンは次のとおりです。

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

EDIT

ハムは、embarassingly十分な、交換ru修正問題のパターンを前に置くようです。公式ドキュメントは、広範囲に使用していますなぜ

は、私は疑問に思うrその後、:((

+0

「r」は正確で重要です。 'r'を置き換える代わりに** ** **' u'(答えを参照)を追加するべきです。 –

+0

@ m.buettner:yup答えを見る前に編集しました。私は行って、「r」と「u」が何をするかを調べました。そして、実際にはどちらも重要です。ありがとう:) – m09

答えて

7

あまりにもUni​​code文字列でなければなりませんあなたのパターン:

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

は、そうでない場合は、明らかsreラテン-1からâを符号化し、その結果のバイトを見つけます3バイトはutf-8 です。

"[’]"は、"[\xe2\x80\x99]"と等価であり、u'â'.encode('latin-1')は、\xe2である。

+0

ヒントのためにありがとう、私はあなたが答えた直前に気づいた:) – m09

+0

're.U'は魔法のようにユニコードをオンにしません、単に' \ w'の意味を変更します。 –

関連する問題