Frage

Perl und einige andere aktuelle Regex-Engines unterstützen Unicode-Eigenschaften, wie zum Beispiel die Kategorie, in einem regulären Ausdruck. Z.B. in Perl können Sie \p{Ll} verwenden, um einen beliebigen Kleinbuchstabe oder p{Zs} für jeden Raum Separator anzupassen. Ich sehe nicht, die Unterstützung für diesen entweder in der 2.x noch 3.x Zeilen Python (mit gebührender Reue). Ist jemand bewusst eine gute Strategie, um eine ähnliche Wirkung zu erzielen? Homegrown Lösungen sind willkommen.

War es hilfreich?

Lösung

Haben Sie versucht, Ponyguruma , eine Python-Bindung an den Oniguruma für reguläre Ausdrücke? In diesem Motor kann man einfach sagen \p{Armenian} Armenian Zeichen übereinstimmen. \p{Ll} oder \p{Zs} Arbeit zu.

Andere Tipps

regex Modul (eine Alternative zu dem Standard-Modul re) unterstützt Unicode-Codepoint-Eigenschaften mit der \p{} Syntax.

Sie können sorgfältig verwenden unicodedata auf jedes Zeichen:

import unicodedata

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

Apropos homegrown Lösungen, vor einiger Zeit schrieb ich ein kleines Programm rel="nofollow genau das zu tun - eine Unicode-Kategorie wie \p{...} in einen Wertebereich geschrieben konvertieren, aus dem Unicode Spezifikation (v.5.0.0). Nur Kategorien werden unterstützt (ex .: L, Zs), und ist mit dem BMP beschränkt. Ich bin hier, falls jemand es nützlich sein Posting (obwohl das Oniguruma wirklich scheint eine bessere Option).

Beispiel Nutzung:

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

Hier ist die Quelle . Es gibt auch eine JavaScript-Version , die gleichen Daten verwendet werden.

Sie haben Recht, dass Unicode-Festigkeitsklassen nicht von dem Python Regex-Parser unterstützt werden.

Wenn Sie ein nettes Hack machen wollte, dass in der Regel sinnvoll wäre, könnten Sie einen Präprozessor erstellen, die eine Zeichenfolge für eine solche Klasse-Token durchsucht (\p{M} oder was auch immer) und ersetzt sie durch die entsprechenden Zeichensätze, so dass zum Beispiel , \p{M} würde [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F] geworden und \P{M} würde [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F].

Die Menschen würden es Ihnen danken. :)

Beachten Sie, dass während \p{Ll} keine Entsprechung in Python regulären Ausdrücken hat, sollte \p{Zs} von '(?u)\s' abgedeckt werden. Die (?u), wie die Dokumentation sagen: „Make \ w, \ W \ B \ B \ d, \ D, \ s und \ S abhängig von der Unicode-Zeicheneigenschaften-Datenbank.“ Und \s jeden Abstands Charakter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top