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:
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