我有一个包含阿拉伯语和英语句子的字符串。我想要的只是提取阿拉伯语句子。
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)
但是,我不希望这样。
答案 0 :(得分:4)
您可以使用re.sub
将ascii字符替换为空字符串。
>>> my_string="""
... What is the reason
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ
... behind this?
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ
... """
>>> print(re.sub(r'[a-zA-Z?]', '', my_string).strip())
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ
你的正则表达式没有用,因为你使用的是Python 2而你的字符串是str
,你需要将my_string
转换为unicode才能使用它。但它确实在Python3.x上完美运行
>>> print "".join(re.findall(ur'[\u0600-\u06FF]', unicode(my_string, "utf-8"), re.UNICODE))
ذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَ
答案 1 :(得分:2)
您的原始代码是正确的,只需要使用正确的编码对my_string
进行编码,'utf-8'并在u
模式中添加re
,因为您正在使用Python2,< / p>
>>> for x in re.findall(ur'[\u0600-\u06FF]+', my_string.decode('utf-8')):
print x
ذَلِكَ
الْكِتَابُ
لَا
رَيْبَ
فِيهِ
هُدًى
لِلْمُتَّقِينَ
ذَلِكَ
الْكِتَابُ
لَا
رَيْبَ
فِيهِ
هُدًى
لِلْمُتَّقِينَ
这将为您提供匹配的unicode字符串列表,而不是您不需要将其与''.join
如果您使用的是Python3,则不需要任何编码tweeking,因为默认编码是'utf-8':
>>> for x in re.findall(r'[\u0600-\u06FF]+', my_string):
print(x)
ذَلِكَ
الْكِتَابُ
لَا
رَيْبَ
فِيهِ
هُدًى
لِلْمُتَّقِينَ
ذَلِكَ
الْكِتَابُ
لَا
رَيْبَ
فِيهِ
هُدًى
لِلْمُتَّقِينَ
答案 2 :(得分:2)
您的代码是:
print re.findall(r'[\u0600-\u06FF]+',my_string)
匹配字节序列时,没有Unicode代码点这样的概念。因此,正则表达式中的\u
转义序列没有任何意义。它们没有按你的想法解释,只是意味着u
。
因此,在解析正则表达式的字节时,它等同于:
print re.findall(r'[u0600-u06FF]+',my_string)
此字符类被解释为“u060
中的一个,或0-u
范围内的一个字节,或06FF
中的一个”。反过来,这相当于[0-u]
,因为所有其他字节都已包含在此范围内。
print re.findall(r'[0-u]+', my_string)
演示:
my_string = "What is thizz?"
print re.findall(r'[\u0600-\u06FF]+',my_string)
['What', 'is', 'thi', '?']
请注意,zz
不匹配,因为它在ASCII字符集中位于u
之后。