Usando rango en expresiones regulares para letras árabes

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.