匹配阿拉伯字母的正则表达式

问题描述 投票:0回答:4

在Python中使用正则表达式时,很容易使用括号来表示一系列字符

a-z
,但这似乎不适用于其他语言,例如阿拉伯语:

import re
pattern = '[ي-ا]'
p = re.compile(pattern)

这会导致一个很长的错误报告,以

结尾
raise error("bad character range")
sre_constants.error: bad character range

如何解决这个问题?

python regex python-3.x
4个回答
11
投票

由于阿拉伯字符是从右向左渲染的,因此下面的 Correct 字符串(“from

ا
to
ي
”)会向后渲染(如果要确认,请尝试选择该字符串):

'[ا-ي]'

控制台输出:

>>> re.compile('[ا-ي]')
<_sre.SRE_Pattern object at 0x6001f0a80>

>>> re.compile('[ا-ي]', re.DEBUG)
in
  range (1575, 1610)
<_sre.SRE_Pattern object at 0x6001f0440>

所以你的模式

'[ي-ا]'
实际上是“从
ي
ا
”,这是一个无效范围,因为
ا
的代码点小于
ي
的代码点。

为了防止混淆,Ignacio Vazquez-Abrams 使用 Unicode 转义的建议是我上面提供的解决方案的一个很好的替代方案。


9
投票

改用 Unicode 转义符。

>>> re.compile('[\u0627-\u064a]')
<_sre.SRE_Pattern object at 0x237f460>

2
投票

批准的答案确实有效,但是unicode

[\u0627-\u064a]
不包括字母“?”的变体,例如“У”、“Т”或“Х”,以及字母“”及其变体“Ф” 。 (我想对已批准的答案进行评论/建议编辑,但有一个队列)

因此,如果有人(重新)访问这个问题并需要这些字母变体,对我来说效果更好的 unicode 是 [\u0600-\u06FF],答案是:

pattern = re.compile('[\u0600-\u06FF]')

0
投票

您可以安装 PyPi 正则表达式模块 (

pip install regex
),然后使用具有 字符类交集的模式:

[\p{Arabic}&&\p{L}]+

[\p{Arabic}&&\p{L}]
字符类与任何阿拉伯文字字符 (
\p{Arabic}
) 匹配,该字符也必须是 (
&&
) 字母 (
\p{L}
)。
+
使其匹配一个或多个此类字符。

import regex

text = "هذه المقالة عن اللغة العربية. لمعانٍ أخرى، طالع عربية (توضيح)."
print(regex.findall(r"[\p{Arabic}&&\p{L}]+", text))
# => ['هذه', 'المقالة', 'عن', 'اللغة', 'العربية', 'لمعان', 'أخرى', 'طالع', 'عربية', 'توضيح']

查看 Python 在线演示

© www.soinside.com 2019 - 2024. All rights reserved.