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
Suche regulären Ausdruck für alle Unicode-Buchstaben
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Vielleicht so:
Leider ist das Unicode-Flag nur in der Library Reference drin, jedoch nicht im Python Regular Expression HOWTO.
Code: Alles auswählen
regex = re.compile(r'[^\d\s]*', re.UNICODE)
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
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Würde ohne RE gehen, z.B.:sma hat geschrieben:alles abdeckt, was im Unicode-Standard als Buchstabe zählt
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
@jens: Es gibt in `unicodedata` auch eine `category()`-Funktion. Ich weiss nicht ob "LETTER" im Namen so zuverlässig ist.
Schlägst du sowas vor?
Stefan
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))