2017-06-24 17 views
0

ドイツ語textのトークンに一致する正規表現を作成しました。これはタイプstringです。Python 2.7 Regex Tokenizer実装が動作しない

私の正規表現は、regex101.comを使用して期待どおりに動作しています。ここ例文と私の正規表現のリンクは次のとおりです。My regex + example on regex101.com

だから私はこのようなpython 2.7でそれを実装:

GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex 
([A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ 
|\d+([.,]\d+)?([€$%])? # numbers, allowing commas as seperators and € as currency 
|[\wäöü]+ # matches normal words 
|\.\.\. # ellipsis 
|[][.,;\"'?():-_'!] # matches special characters including ! 
''' 

def tokenize_german_text(text): 
    ''' 
     Takes a text of type string and 
     tokenizes the text 
    ''' 
    matchObject = re.findall(GERMAN_TOKENIZER, text) 
    pass 

tokenize_german_text(u'Das ist ein Deutscher Text! Er enthält auch Währungen, 10€') 

結果:

result を私はこれをデバッグした時、私はあることを発見しましたmatchObjectは空文字の11個のエントリを含むリストに過ぎません。なぜ期待どおりに動作しないのですか?これをどうすれば解決できますか?

+1

追加します注意: 're.UNICODE'オプションで正規表現をコンパイルして、' \ w'がASCII以外の文字とマッチするようにすることができます。結局、ウムラウト以外のアクセントを含むドイツ語があります今はそれらが見当たりません。 –

答えて

1

re.findall()は、キャプチャグループ内の一致のみを収集します(ただし、正規表現にキャプチャグループがない場合は、それぞれの一致をキャプチャします)。

あなたの正規表現は何度もマッチしますが、マッチするたびにキャプチャグループが参加していないマッチが1つになります。キャプチャグループを削除すると、結果が表示されます。あなたが実際に(-自体ではなく):_間の文字の範囲と一致する場合を除き、また、文字クラスの最後に-を置く:

GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex 
(?:[A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ 
|\d+(?:[.,]\d+)?[€$%]? # numbers, allowing commas as seperators and € as currency 
|[\wäöü]+ # matches normal words 
|\.\.\. # ellipsis 
|[][.,;\"'?():_'!-] # matches special characters including ! 
''' 

結果:

['Das', 'ist', 'ein', 'Deutscher', 'Text', '!', 'Er', 'enthält', 'auch', 'Währungen', ',', '10€'] 
関連する問題