2017-06-12 25 views
1

ヘブライ語と英語の巨大な文字列がありますが、ヘブライ語の文字列のみを抽出したいのですが、ヘブライ語で動作する正規表現の例は見つかりませんでした。ヘブライ語と英語の文字列の間の区切り

私はすべての文字を比較する愚かな方法で試してみました:

import string 
data = [] 
for s in slist: 
    found = False 
    for c in string.ascii_letters: 
     if c in s: 
      found = True 
    if not found: 
     data.append(s) 

をそして、それは動作しますが、それは、もちろん非常に遅く、私のリストは巨大です。 これより、はるかに高速だったstring.ascii_lettersに文字列の最初の文字だけを比較しようとしましたが、英語の文字で始まる文字列を除外し、そこに "混在した"文字列を残しています。私はヘブライ語の "純粋な"ものだけを求めます。

これはもっとうまくいくと確信しています...助け、誰ですか?

PS:私はPythonプログラムの中でそれを行うことを好むが、同じことをgrepコマンドでもこの1つは動作するはず

答えて

3

re.search('[' + string.ascii_letters + ']', s) 

これがtrueを返した場合、あなたの文字列が純粋ヘブライ語ではありません。別のオプションは、ヘブライ語の辞書を作成することです

>>> import re 
>>> filter(lambda x: re.match(r'^[^\w]+$',x),s) 
+1

あなたの編集版がトリックをしました、ありがとうございました! –

1

を助ける:

import re 
data = [s for s in slist if re.match('^[a-zA-Z ]+$', s)] 

これは、そのすべての文字列を選択します小文字と大文字の英字とスペースで構成されています。文字列に数字や句読記号を含めることができる場合は、許可された文字を正規表現に含める必要があります。

編集:ちょうど気づいただけで、それは英語のみの文字列を除外しますが、それ以外の方法で行う必要があります。代わりにこれを試すことができます:

data = [s for s in slist if not re.match('^.*[a-zA-Z].*$', s)] 

これは、少なくとも1つの英字を含む文字列をすべて破棄します。文字列は、任意のASCII文字が含まれているかどうかを確認(。すなわち、非ヘブライ語)を使用する

+0

でも、完全に英語ではない文字列を見つけることができません。 –

+1

@OferSadanはい、回答を更新しました。これはうまくいくはずです。 – 0605002

0

はこれを試してみてください

hebrew_words = {...} 

そして、あなたは単語のリストを反復処理し、この辞書無視ケースに対してそれらを比較します。これは、他のアプローチ(O(n)、nはあなたの単語のリストの長さです)よりもはるかに速く動作します。

ヘブライ語のすべてまたはほとんどをどこかで取得する必要があるという欠点があります。私はcsvまたは他の形式でウェブ上でそれを見つけることが可能だと思います。それを解析してPython辞書に入れます。

ただし、このような単語のリストを非常に頻繁に、そして非常に迅速に解析する必要がある場合は、意味があります。別の問題は、辞書に完全に正解を与えないすべてのヘブライ語が含まれているわけではないことです。

1

+0

これはまったく役に立ちません。文字列の中には複数の単語があり、そのうちのいくつかは不器用ですが、ヘブライ文字のみを含むので、まだ必要です。 –

+1

@OferSadan次に、正規表現を使用する方が良いです。しかし、それは遅くなります。 – Nurjan

2

Pythonには、広範なユニコードサポートがあります。それはあなたが求めているものに依存します。ヘブライ語の単語は、ヘブライ語の文字と空白のみを含む単語ですか、それとも単にラテン文字を含まない単語ですか?いずれにせよ、あなたは直接そうすることができます。基準セットを作成し、メンバーシップをテストしてください。

セットのメンバーシップのテストは、string.ascii_lettersを使用した繰り返しよりもはるかに高速であることに注意してください。

私はヘブライ語を話さないので、アルファベットの1文字または2文字が間違っている可能性があります。

def is_hebrew(word): 
    hebrew = set("א‎ב‎ג‎ד‎ה‎ו‎ז‎ח‎ט‎י‎כ‎ך‎ל‎מ‎נ‎ס‎ ע‎פ‎צ‎ק‎ר‎ש‎ת‎ם‎ן‎ף‎ץ"+string.whitespace) 
    for char in word: 
     if char not in hebrew: 
      return False 
    return True 

def contains_latin(word): 
    return any(char in set("abcdefghijklmnopqrstuvwxyz") for char in word.lower()) 
# a generator expression like this is a terser way of expressing the 
# above concept. 

hebrew_words = [word for word in words if is_hebrew(word)] 
non_latin words = [word for word in words if not contains_latin(word)] 
関連する問題