在正则表达式中检测阿拉伯字符

时间:2018-06-21 14:42:49

标签: python regex python-3.x

我有一个阿拉伯语句子数据集,我想删除非阿拉伯语字符或特殊字符。我在python中使用了此正则表达式:

text = re.sub(r'[^ء-ي0-9]',' ',text)

它可以正常工作,但是在某些句子中(整个数据集中有4种情况),正则表达式也删除了阿拉伯语单词!

我使用Panda(python软件包)读取数据集,例如:

train = pd.read_excel('d.xlsx', encoding='utf-8')

为了展示您的照片,我在Pythex网站上进行了测试: enter image description here

出什么问题了?

------------------编辑:

示例中的句子:

  

انابحكيرجعومباركواعملوحفلةواحرقوهابالمعازيمولماالاخوانيروحو   يعزواحرقوالعزا-احسنلكموالله#مصر

     

ﺷﻔﻴﻖ..ﺃﺣﻨﺍ ﺃﺣﻨﺍ ﻳﺎ #ﻣﺴﺨﺮﺓ#ﻋﺒﺚ #EgyPresident#埃及(Egypt)

2 个答案:

答案 0 :(得分:2)

那些错误包含的字符不在阿拉伯语(U + 0621..U + 64A)的通用 Unicode范围内,但会以其初始,中间和最终形式进行“硬编码”。 / p>

与基于拉丁文的语言中的大写字母相比,但更为严格的是,阿拉伯语文字以特殊的“蓬勃发展”形式表示单词的开头和结尾。此外,它还允许采用“隔离”形式(当字符不是完整单词的一部分时使用)。

通常 在文件中被编码为'an'阿拉伯字符,而实际的初始,中间或最终形式的呈现将留给文本呈现器,但是由于所有形式也都具有Unicode代码点自己也可以“硬编码”确切的形式。那就是您遇到的:这两种系统的混合。

幸运的是,硬编码形式的Unicode范围也是固定值:

  

阿拉伯语表示形式-A是Unicode块,用于编码波斯语,乌尔都语,信德语和中亚语言所需的上下文形式和字母变体的连字。表示形式仅用于与旧标准(例如,DOS中使用的代码页864)兼容,并且通常以视觉而非逻辑顺序使用。
  (https://en.wikipedia.org/wiki/Arabic_Presentation_Forms-A

及其范围是U + FB50..U + FDF​​F(演示文稿形式A)和U + FE70..U + FEFC(演示文稿形式B)。如果您将这些范围添加到排除集中,则正则表达式将不再删除这些文本:

[^0-9\u0621-\u064a\ufb50-\ufdff\ufe70-\ufefc]

取决于您的浏览器和/或编辑器,选择此文本进行复制和粘贴时可能会遇到问题。显式使用指定确切字符的字符串可能更清楚:

{{1}}

答案 1 :(得分:0)

我尝试了Pythex,并发现了它(在Regular Expression Arabic characters and numbers only的帮助下):[\u0621-\u064A0-9]捕获了几乎所有非阿拉伯字符。出于未知的原因,它不会捕获“ y”,因此您必须自己添加:[\u0621-\u064A0-9y] 这可以捕获所有非阿拉伯字符。对于特殊字符,很抱歉,但除了将它们添加到[\u0621-\u064A0-9y#\!\?\,]

之外,我什么都没找到