2016-12-17 9 views
0

正規表現が機能しないのはなぜですか?私はPython 2.7.5を使用する必要があります。Python 2.7.5でUmlautを使用した正規表現

pattern = re.compile('\d{4};[a-zA-ZäöüÄÖÜß. -]+;.+') 

私はcsvファイルを読んでいる: これが私の表現です。最初は;まで4桁で、2番目の;はa-Z、ウムラウト、.またはスペースまたは.の文字でなければなりません.2番目の;の後には任意の文字を入れることができます。

今、私の問題:äöüまたはßのようなウムラウトは受け付けません。私がウムラウトを指定していない3番目の「部分」では、ウムラウトが発生してもそれは問題ありません。

私は# -*- coding: utf-8 -*-をスクリプトの冒頭に付けました。 UTF-8にエンコードすることにより

答えて

3

は、あなたは、文字クラスにマルチバイト列に入った:

>>> 'ä' 
'\xc3\xa4' 

をASCII文字の範囲外の何かをエンコードするために、複数のバイトを必要とします。

文字クラスは、0xC3バイトまたは 0xA4バイトのいずれかと一致するようになりました。あなたのクラスにはより多くのバイトが含まれており、と一致しますが、'ä'と一致しますが、他のUTF-8バイトシーケンスとC3バイトまたはA4バイトも一致する可能性があります。

あなたはまたはは、最初のUnicode文字列にデータをデコードし、Unicodeの正規表現を使用、明示的に各UTF-8バイトのペア(本当の痛み)と一致する必要があると思い、次のいずれか

re.compile(u'\d{4};[a-zA-ZäöüÄÖÜß. -]+;.+', flags=re.UNICODE) 

ドゥパスをその正規表現を使用するとUnicodeテキストで表示される

+0

ありがとうございました!私は今この問題で数日間苦労しています。 –

+0

は 'ru '\ d {4} ...''(生のunicode文字列のため)ではありませんか? – thebjorn

+0

@thebjorn:そうではありません。生の文字列リテラルは、同じ結果に対して異なる構文にすぎません。この場合、 '\ d'は結果の値に' \ d'のままです。 Python 3には 'ru'というプリフィックスはありません。したがって、多言語コード(Python 2とPythonで実行する必要があるコード)では、その接頭辞を使用しない傾向があります。 –