Cuando se usa Regex en Python, es fácil usar corchetes para representar un rango de caracteres az
, pero esto no parece funcionar para otros idiomas, como el árabe:
import re pattern = '[ي-ا]' p = re.compile(pattern)
Esto resulta en un informe de error largo que termina con
raise error("bad character range") sre_constants.error: bad character range
¿Cómo se puede arreglar esto?
Usa escapes de Unicode en su lugar.
>>> re.compile('[\u0627-\u064a]') <_sre.SRE_Pattern object at 0x237f460>
Dado que el carácter árabe se representa de derecha a izquierda, la cadena correcta a continuación, que dice “de ا
a ي
“, se procesa al revés (intente seleccionar la cadena si desea confirmar):
'[ا-ي]'
Salida de consola:
>>> re.compile('[ا-ي]') <_sre.SRE_Pattern object at 0x6001f0a80> >>> re.compile('[ا-ي]', re.DEBUG) in range (1575, 1610) <_sre.SRE_Pattern object at 0x6001f0440>
Entonces, su patrón '[ي-ا]'
, es en realidad “de ي
a ا
“, que es un rango no válido, ya que el punto de código de ا
es más pequeño que el punto de código de ي
.
Para evitar confusiones, la sugerencia de Ignacio Vázquez-Abrams de usar Unicode escape es una buena alternativa a la solución que proporcioné anteriormente.