Seite 1 von 1

Suche regulären Ausdruck für alle Unicode-Buchstaben

Verfasst: Donnerstag 3. April 2008, 07:44
von sma
Wenn ich einen regulären Ausdruck haben möchte, der alles abdeckt, was im Unicode-Standard als Buchstabe zählt -- z.B. alles, was bei JavaScript oder Java als Beginn eines Bezeichners erlaubt ist -- muss ich da wirklich einen unglaublich langen [...] Ausdruck benutzen, der alle gültigen Unicode-Zeichen aufzählt? Ein `(?u)\w` funktioniert nicht, da es auch `0` bis `9` (und `_`) enthält. Ein `\p{...}` wie in Java funktioniert leider auch nicht.

Stefan

Verfasst: Donnerstag 3. April 2008, 08:26
von mkesper
Vielleicht so:

Code: Alles auswählen

regex = re.compile(r'[^\d\s]*', re.UNICODE)
Leider ist das Unicode-Flag nur in der Library Reference drin, jedoch nicht im Python Regular Expression HOWTO.

Verfasst: Donnerstag 3. April 2008, 08:44
von sma
Dein Ausdruck sagt jetzt "alles außer Ziffern und Leerzeichen". Das ist mehr als nur die Buchstaben (letters).

Der EcmaScript-Standard fordert etwa, ein Bezeichner darf mit einem Buchstaben aus den Kategorien Lu, Ll, Lt, Lm, Lo oder Nl beginnen. Die Folgezeichen können aus noch mehr Kategorien stammen. Dennoch sind das längst nicht alle Zeichen.

Das re-Modul beherrscht offenbar auch keine range-substraction in der Form `[\w&&[^\d]]` was mir zusammen mit dem (?u) Flag reichen würde.

Stefan

Re: Suche regulären Ausdruck für alle Unicode-Buchstaben

Verfasst: Donnerstag 3. April 2008, 08:55
von jens
sma hat geschrieben:alles abdeckt, was im Unicode-Standard als Buchstabe zählt
Würde ohne RE gehen, z.B.:

Code: Alles auswählen

import unicodedata

TestString = u"\u00DE\u00F6\u00B1"

for char in TestString:
    name = unicodedata.name(char, "")
    if "LETTER" in name:
        print "Letter: %r" % char

Verfasst: Donnerstag 3. April 2008, 09:05
von audax
Das kann das Python re Modul leider nicht. Ich finds auch doof :/
Muss man wohl wirklich per Hand machen.

Verfasst: Donnerstag 3. April 2008, 09:17
von BlackJack
@jens: Es gibt in `unicodedata` auch eine `category()`-Funktion. Ich weiss nicht ob "LETTER" im Namen so zuverlässig ist.

Verfasst: Donnerstag 3. April 2008, 09:18
von sma
Schlägst du sowas vor?

Code: Alles auswählen

import re, sys, unicodesdata
cats = "Lu,Ll,Lt,Lm,Lo,Nl".split(",")
pattern = re.compile(u"[%s]" % re.escape(u"".join(unichr(i) for i in xrange(sys.unicodemax + 1) if unicodedata.category(unichr(i)) in cats))
Stefan