expresiones regulares de Python que coinciden con propiedades Unicode
Perl y algunos otros motores de expresiones regulares actuales admiten propiedades Unicode, como la categoría, en una expresión regular. Por ejemplo, en Perl se puede utilizar \p{Ll}
para hacer coincidir una letra minúscula arbitraria o p{Zs}
para cualquier separador de espacio. No veo soporte para esto ni en las líneas 2.x ni 3.x de Python (con el debido pesar). ¿Alguien conoce una buena estrategia para conseguir un efecto similar? Las soluciones locales son bienvenidas.
El módulo regex (una alternativa al re
módulo estándar) admite propiedades de punto de código Unicode con la \p{}
sintaxis.
¿Has probado Ponyguruma , un enlace de Python al motor de expresiones regulares de Oniguruma ? En ese motor puedes simplemente decir \p{Armenian}
que coincida con los caracteres armenios. \p{Ll}
o \p{Zs}
trabajar también.
Puedes usar minuciosamente datos unicode en cada carácter:
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
Hablando de soluciones locales, hace algún tiempo escribí un pequeño programa para hacer justamente eso: convertir una categoría Unicode escrita como \p{...}
en un rango de valores, extraídos de la especificación Unicode (v.5.0.0). Solo se admiten categorías (por ejemplo, L
, Zs
) y está restringido a BMP. Lo publico aquí por si a alguien le resulta útil (aunque ese Oniguruma realmente parece una mejor opción).
Uso de ejemplo:
>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>
Aquí está la fuente . También existe una versión JavaScript , que utiliza los mismos datos.