在Python中使用Regex时,很容易使用括号来表示一系列字符a-z
,但这似乎不适用于其他语言,例如阿拉伯语:
import re
pattern = '[ي-ا]'
p = re.compile(pattern)
这会导致以
结尾的长错误报告raise error("bad character range")
sre_constants.error: bad character range
如何解决这个问题?
答案 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]