2017-03-24 6 views
2

英語と他のユニコード文字を組み合わせたテキストで正規表現を見つける必要があります。混合言語の単語のための単語の終りの正規表現(python2で)

問題がある - ワード境界は、混合言語のため正しくありません。

text: הmאפrקt boom sam 
regex: m\b 
also tried: m(?=\W) 

望ましい結果:「ブーム」と「サム」ではなく、第一単語にのみ「M」を取り込みます。

しかし、実際には、 "m \ b"正規表現はテキスト内のすべての "m"文字と一致します。最初の "m"が単語の真中にあるので、これは間違っています(私の見解から)。

私は実用的なソリューションである、このような醜い先読みを使用するために管理:

(?=$|[^a-zא-ת]) 

意味:それはどちらかに見える終りの文のために、または非英語以外の他の - 救いの手紙、それを消費しません。

しかし、これは完全な解決策ではありません。発音記号や他の言語の他の文字は扱いません。

python2の正規表現で複数の言語が混在した単語境界を扱うよりエレガントな方法はありますか?

私のコードサンプル:

text = ur"הmאפrקt boom sam" 
result = re.sub(ur'm\b', 'X', text, flags=re.I+re.M+re.S) 

result is: "הXאפrקt booX saX" 
should be: "הmאפrקt booX saX" 

ソリューションヴィクトルの答えに

感謝。

text = re.sub(oldtext, replacement, text, flags=re.UNICODE) 
+0

関連するすべてのPythonコードを表示してください。 –

+0

Aha、あなたが置き換えている、私は私の答えに 're.sub'の例を追加します。 –

+1

質問の名前を世界の終わりの正規表現に変更する必要があります... lol – antoni

答えて

3

あなたは\b Unicode対応にするためにre.UNICODEフラグを使用して正規表現をコンパイルする必要があります:すべての文字列がUnicodeであることを提供します。また、使用しているすべての文字列はUnicodeである必要があります。

# -*- coding: utf-8 -*- 
import re 
text = ur"הmאפrקt boom sam" 
result = re.sub(ur'm\b', u'X', text, 0, re.UNICODE).encode("utf8") 
print(result) 

online Python 2 demoを参照してください:ここで

はあなた交換コードを固定してもよい方法です。ここで

一致抜粋です:re.findall

# -*- coding: utf-8 -*- 
import re 
s = "הmאפrקt sam" 
match = re.search(ur'\w*m\b', s.decode('utf8'), flags=re.UNICODE) 
if match: 
    print(match.group(0).encode("utf8")) 

そして、たとえば一つだけ一致していることを証明:

print([x.encode("utf8") for x in re.findall(ur'\w*m\b', s.decode('utf8'), flags=re.UNICODE)]) 
# => ['sam'] 

Python 2 online demoを参照してください。

関連する問題