在正则表达式中使用范围表示阿拉伯字母

时间:2014-12-29 09:01:04

标签: python regex python-3.x

在Python中使用Regex时,很容易使用括号来表示一系列字符a-z,但这似乎不适用于其他语言,例如阿拉伯语:

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

这会导致以

结尾的长错误报告
raise error("bad character range")
sre_constants.error: bad character range

如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

由于阿拉伯字符从右到左呈现,因此下面的正确字符串,从اي"向后渲染(如果要确认,请尝试选择字符串):

'[ا-ي]'

控制台输出:

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

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

所以你的模式'[ي-ا]'实际上是从يا&#34;&#34;这是一个无效的范围,因为{{1}的代码点}小于ا的代码点。

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

答案 1 :(得分:6)

改为使用Unicode转义。

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

答案 2 :(得分:0)

已批准的答案确实有效,但是 unicode <span> 不包括字母 'ا' 的变体,例如 'أ'、'آ' 或 'إ',以及带有它的字母 'و'变体'ؤ'。 (我想评论/建议编辑已批准的答案,但有一个队列)

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

[\u0627-\u064a]