sub online number example escape ejemplos python regex unicode ucd character-properties

online - Python Regex que coincide con las propiedades Unicode



re.split python (6)

¿Has probado Ponyguruma , un enlace de Python al motor de expresión regular Oniguruma ? En ese motor, simplemente puedes decir /p{Armenian} para que coincida con los caracteres armenios. /p{Ll} o /p{Zs} también funcionan.

Perl y algunos otros motores regex actuales admiten propiedades Unicode, como la categoría, en una expresión regular. Por ejemplo, en Perl puede usar /p{Ll} para hacer coincidir una letra minúscula arbitraria, o p{Zs} para cualquier separador de espacio. No veo soporte para esto en las líneas 2.x ni 3.x de Python (con los debidos remordimientos). ¿Alguien sabe de una buena estrategia para obtener un efecto similar? Las soluciones de cosecha propia son bienvenidas.


El módulo pypi.python.org/pypi/regex (una alternativa al módulo re estándar) admite las propiedades de punto de código Unicode con la sintaxis /p{} .


Hablando de soluciones de cosecha propia, hace algún tiempo escribí un pequeño program para hacer precisamente eso: convertir una categoría Unicode escrita como /p{...} en un rango de valores, extraídos de la specification Unicode (v.5.0.0). Solo se admiten categorías (por ejemplo, L , Zs ) y está restringido al BMP. Lo estoy publicando aquí en caso de que alguien lo encuentre útil (aunque ese Oniguruma realmente parece una mejor opción).

Ejemplo de uso:

>>> 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 source . También hay una versión de JavaScript , utilizando los mismos datos.


Puedes utilizar unicodedata minuciosamente en cada personaje:

import unicodedata def strip_accents(x): return u''''.join(c for c in unicodedata.normalize(''NFD'', x) if unicodedata.category(c) != ''Mn'')


Tenga en cuenta que mientras /p{Ll} no tiene equivalente en las expresiones regulares de Python, /p{Zs} debería estar cubierto por ''(?u)/s'' . El (?u) , como dicen los documentos, "Make / w, / W, / b, / B, / d, / D, / s y / S depende de la base de datos de propiedades de caracteres Unicode." Y /s significa cualquier carácter de espaciado


Tiene razón en que las clases de propiedad Unicode no son compatibles con el analizador de expresiones regex de Python.

Si quisiera hacer un buen truco, eso sería generalmente útil, podría crear un preprocesador que escanea una cadena para dichos tokens de clase ( /p{M} o lo que sea) y los reemplace con los juegos de caracteres correspondientes, de modo que, para ejemplo, /p{M} se convertiría en [/u0300–/u036F/u1DC0–/u1DFF/u20D0–/u20FF/uFE20–/uFE2F] , y /P{M} se convertiría en [^/u0300–/u036F/u1DC0–/u1DFF/u20D0–/u20FF/uFE20–/uFE2F] .

La gente te agradecería. :)