Question

Perl et quelques autres moteurs actuels prennent en charge regex propriétés Unicode, telles que la catégorie, dans une expression régulière. Par exemple. en Perl, vous pouvez utiliser \p{Ll} pour correspondre à une lettre minuscule arbitraire ou p{Zs} pour tout séparateur d'espace. Je ne vois pas de support pour ce soit dans le 2.x, ni lignes de Python 3.x (avec raison regrets). Quelqu'un est-il au courant d'une bonne stratégie pour obtenir un effet similaire? solutions locales sont les bienvenus.

Était-ce utile?

La solution

Avez-vous essayé Ponyguruma , un python se liant à la Oniguruma moteur d'expression régulière ? Dans ce moteur, vous pouvez simplement dire \p{Armenian} pour correspondre à des caractères arméniens. travail \p{Ll} ou \p{Zs} aussi.

Autres conseils

Le module regex (une alternative au module standard de re) prend en charge les propriétés de codepoint Unicode avec la syntaxe de \p{}.

Vous pouvez utiliser laborieusement unicodedata sur chaque caractère:

import unicodedata

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

En parlant de solutions locales, il y a quelque temps, j'ai écrit un petit de faire exactement cela - convertir une catégorie unicode écrit \p{...} dans une plage de valeurs, extraites des href="http://unicode.org/versions/Unicode5.0.0/" unicode (v.5.0.0). Seules les catégories sont pris en charge (ex .: L, Zs), et est limitée à la BMP. Je poste ici au cas où quelqu'un trouver utile (bien que Oniguruma semble vraiment une meilleure option).

Exemple d'utilisation:

>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>

Voici la source . Il y a aussi une version JavaScript , en utilisant les mêmes données.

Vous avez raison que les classes de propriété Unicode ne sont pas pris en charge par l'analyseur regex Python.

Si vous voulez faire une belle entaille, ce serait généralement utile, vous pouvez créer un préprocesseur qui scanne une chaîne pour ces jetons de classe (\p{M} ou autre) et les remplace par les jeux de caractères correspondants, de sorte que, par exemple , \p{M} deviendrait [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F], et \P{M} deviendrait [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F].

Les gens vous remercier. :)

Notez que si \p{Ll} n'a pas d'équivalent dans les expressions régulières Python, \p{Zs} devrait être couvert par '(?u)\s'. Le (?u), comme les documents disent, « Make \ w, \ W, \ b, \ B \ d \ D, \ s et \ S dépendant de la base de données de propriétés de caractère Unicode. » Et \s désigne tout caractère d'espacement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top