如何使用正则表达式从字符串中仅检索阿拉伯语文本?

时间:2016-04-16 08:16:38

标签: python regex string python-2.7 unicode

我有一个包含阿拉伯语和英语句子的字符串。我想要的只是提取阿拉伯语句子。

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)

但是,我不希望这样。

3 个答案:

答案 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之后。