2012-09-02 22 views
9

正規表現でドイツ語のウムラウトとマッチングできないのに驚いています。私はいくつかのアプローチを試しました。ロケールの設定に最も関わっていましたが、これまでは役に立たなかったのです。これらのバージョンの正規表現でのUmlauts(ロケール経由)

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') 
re.findall(r'\w+', 'abc def g\xfci jkl', re.L) 
re.findall(r'\w+', 'abc def g\xc3\xbci jkl', re.L) 
re.findall(r'\w+', 'abc def güi jkl', re.L) 
re.findall(r'\w+', u'abc def güi jkl', re.L) 

なし\w+で正しくウムラウト-U(U)と一致しません。また、re.Lフラグを削除するか、パターン文字列の先頭にuという接頭辞を付けて(ユニコードにする)、私には役に立たなかった。

アイデア?フラグre.Lはどのように正しく使用されていますか?

答えて

16

docに記載されているように、re.UNICODEフラグを使用しようとしましたか?このthread

>>> re.findall(r'\w+', 'abc def güi jkl', re.UNICODE) 
['abc', 'def', 'g\xc3\xbci', 'jkl'] 

クイック検索ポイントいくつかの説明を与えること:

re.LOCALEはちょうど基礎となるCライブラリに文字を渡します。 は実際には1文字あたり1バイトのバイトストリングでしか動作しません。 UTF-8 は、ASCII範囲外のコードポイントを コードポイントごとに複数のバイトにエンコードし、reモジュールはこれらのバイトのそれぞれを の別の文字として扱います。私の場合は

+0

を使用すると、いや、私は(MEAのculpa)なかった、私は知りませんでしたその旗の存在、それは私の問題を解決する!ありがとう、私はすぐに受け入れられた答えとしてこれをフラグする(より精巧な答えがロケールフラグを使用している私の試行が期待通りに機能しなかった理由を説明しない限り) – Alfe

+0

説明を与えるスレッドへのリンクを与えるために編集 –

+0

Python 2を使用している場合は、Unicode文字列(u "...")を使用してください。スクリプトUTF-8を作成することはお勧めです。 – MRAB

0

\Sが私に\wよりも良い結果を与え、プラスUTF-8のファイルを保存し、プラスre.UNICODE

+1

場合によっては、 '\ S'は一般に句読点や特殊文字(例えば、♯や→など)に一致します。私の場合に必要なものではありません。 – Alfe