在Python中使用正则表达式时,很容易使用括号来表示一系列字符
a-z
,但这似乎不适用于其他语言,例如阿拉伯语:
import re
pattern = '[ي-ا]'
p = re.compile(pattern)
这会导致一个很长的错误报告,以
结尾raise error("bad character range")
sre_constants.error: bad character range
如何解决这个问题?
由于阿拉伯字符是从右向左渲染的,因此下面的 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 转义的建议是我上面提供的解决方案的一个很好的替代方案。
改用 Unicode 转义符。
>>> re.compile('[\u0627-\u064a]')
<_sre.SRE_Pattern object at 0x237f460>
批准的答案确实有效,但是unicode
[\u0627-\u064a]
不包括字母“?”的变体,例如“У”、“Т”或“Х”,以及字母“”及其变体“Ф” 。 (我想对已批准的答案发表评论/建议编辑,但有一个队列)
因此,如果有人(重新)访问这个问题并需要这些字母变体,对我来说效果更好的 unicode 是 [\u0600-\u06FF],答案是:
pattern = re.compile('[\u0600-\u06FF]')
您可以安装 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 在线演示。