expresiones regulares de Python que coinciden con propiedades Unicode

Resuelto ThomasH asked hace 14 años • 6 respuestas

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.

ThomasH avatar Dec 02 '09 20:12 ThomasH
Aceptado

El módulo regex (una alternativa al remódulo estándar) admite propiedades de punto de código Unicode con la \p{}sintaxis.

ronnix avatar Nov 30 '2010 16:11 ronnix

¿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.

joeforker avatar Dec 02 '2009 22:12 joeforker

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')
zellyn avatar Nov 12 '2010 00:11 zellyn

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.

mgibsonbr avatar Mar 04 '2012 05:03 mgibsonbr