2016-11-27 6 views
-3

は、私のような異なる言語からの文字を含む文字列を持っている:多言語文字列の正規表現

en <chars in english> fr <chars in french> es <chars in spanish> 

を私は上記の文字列から特定の言語でちょうど部分文字列を抽出する必要があります。 Python2.6でregexや他のツールを使ってどうすればいいですか?

ps。それは次のように異なる順序である可能性があります:en(。)es(。)it(。*)、問題はesかfrかですか?それはlatin charsetにありません。

+0

1つを見つけることができますか? – Mohammad

+1

あなたは '[英語の単語] - [スペイン語の単語] - ...'のような信頼できる構造を持っていますか、あるいは言語を推測する必要はありますか?これは難しい作業です。 – Jasper

+0

予期した結果の例を投稿できますか?それは本当に明確ではありません... –

答えて

2

Regexはユニコードで動作し、文字列を分割するオプションがいくつかあります。ここでは、文字列が "en"や "es"などの言語コードの境界で分割され、リストに入れられる例を示します。次に、リストを反復し、あなたが望む言語を見つけることです。

>>> text = u"en <chars in english> fr <chars in french> es <chars in spanish>" 
>>> languages = set((u'en', u'fr', u'es')) 
>>> re_languages = '|'.join(languages) 
>>> splitter = re.compile(ur'\b({})\b'.format(re_languages)) 
>>> splitter.split(text) 
[u'', u'en', u' <chars in english> ', u'fr', u' <chars in french> ', u'es', u' <chars in spanish>'] 

>>> parts=splitter.split(text)[1:] 
>>> for i in range(0, len(parts),2): 
...  if parts[i] == 'es': 
...   print parts[i+1] 
... 
<chars in spanish> 
>>> 

それとも、それらを使用すると、正規表現で特定のlanguage`に `定義するにはどうすればよい時間

>>> re.findall(r'\b(en|es|fr) (.*?)(?:(?= (?:en|es|fr)\b)|$)', text) 
[(u'en', u'<chars in english>'), (u'fr', u'<chars in french>'), (u'es', u'<chars in spanish>')] 
>>> 
+0

あなたは言語コード境界 'en'、' fr'と 'es'が異なる文字セットにあることを考慮しましたか?例として、 'r'en(。*)fr''として見つけようとすると、別の文字セットで' fr'のために何も見つかりません。 – swserg

+0

ええ、何?ユニコードを使用している場合、それらは異なる文字セットにはありません。何とか複数の文字セットを使用している場合(おそらく複数のWindowsコードページ?)、それらは同じ文字列にはできません。そして、それを動作させるには、それらをデコードしてユニコードにする必要があります。テスト 're.search(r'en(。*)fr '、u" en fr <フランス語の文字> es <スペイン語のchars> ")'はうまく動作します。 – tdelaney