2016-04-16 21 views
5

私はアラビア語と英語の両方の文章を持つ文字列を持っています。私が欲しいのは、アラビア語のセンテンスだけを抽出することです。正規表現を使用して文字列からアラビア語のテキストのみを取り出す方法は?

my_string=""" 
What is the reason 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
behind this? 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
""" 

This Linkアラビア文字のUnicode範囲は0600-06FFであることを示しています。

ので、非常に基本的な試みがある私の心に来た:それは次のリストを返し、これは無残に失敗し、

import re 
print re.findall(r'[\u0600-\u06FF]+',my_string) 

しかし。

['What', 'is', 'the', 'reason', 'behind', 'this?'] 

ご覧のとおり、これは私が望むものとは正反対です。私はここで何が欠けているのですか?

N.B.私はそれを望んでいない、

print re.findall(r'[^a-zA-Z\s0-9]+',my_string) 

しかし:

は、私は以下のように逆マッチングを使って、アラビア文字を一致させることができます知っています。

答えて

4

re.subを使用すると、ASCII文字を空の文字列に置き換えることができます。

>>> my_string=""" 
... What is the reason 
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
... behind this? 
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
... """ 
>>> print(re.sub(r'[a-zA-Z?]', '', my_string).strip()) 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 

ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 

あなたは、Python 2を使っているので、あなたの正規表現は動作しませんでしたし、あなたの文字列は、あなたはそれを動作させるためにUnicodeにmy_stringを変換する必要がstrです。しかし、それは完全にあなたの元のコードは、あなたがPython2で作業しているので、ちょうど適切なエンコード、「UTF-8」でmy_stringをエンコードし、あなたのreパターンでuを追加するために必要な、正しいPython3.x

>>> print "".join(re.findall(ur'[\u0600-\u06FF]', unicode(my_string, "utf-8"), re.UNICODE)) 
ذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَ 
+0

あなたの素敵な答えをありがとう、+1しかし、なぜ上記の試みはうまくいかないのですか? –

+0

私は満足しています:)ありがとう –

2

上で動作しませんでした

>>> for x in re.findall(ur'[\u0600-\u06FF]+', my_string.decode('utf-8')): 
     print x 


ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 

これはあなたにマッチしたUnicode文字列の代わりに、あなたはのpython3にあった場合は、nはない''.join

でそれらをバックに参加する必要はありません、単一の文字のリストを与えますEEDデフォルトエンコーディングとしてtweekingエンコーディングのいずれかが 'UTF-8' です:

>>> for x in re.findall(r'[\u0600-\u06FF]+', my_string): 
     print(x) 


ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
2

あなたのコードは次のとおりです。

print re.findall(r'[\u0600-\u06FF]+',my_string) 

バイトシーケンスに一致する、Unicodeコードポイントとしてはそのような概念はありません。したがって、正規表現内の\uエスケープシーケンスは意味をなさない。彼らはあなたが思った通り解釈されませんが、ただuを意味します。

バイトの正規表現を解析するときので、それは同等です:

print re.findall(r'[u0600-u06FF]+',my_string) 

この文字クラスは「u060の1、または範囲0-uでバイト、または06FFの一つ」と解釈されます。これは今度は[0-u]と等価です。他のすべてのバイトはすでにこの範囲に含まれているからです。

print re.findall(r'[0-u]+', my_string) 

デモンストレーション:それはASCII文字セットにu後ろに来ているのでzzは、一致しないことを

my_string = "What is thizz?" 
print re.findall(r'[\u0600-\u06FF]+',my_string) 
['What', 'is', 'thi', '?'] 

注意。

+0

これは状況の最善の説明です。私は+2ができることを望む。ありがとうございました:) –

+1

は、「** u060 **の1つ、または* 0-u *、または* 06FF *のいずれかのバイト」 – sweaver2112

+0

お読みいただきありがとうございます。私はそれを修正した。 –

関連する問題