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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Das kann das Python re Modul leider nicht. Ich finds auch doof :/
Muss man wohl wirklich per Hand machen.
BlackJack

@jens: Es gibt in `unicodedata` auch eine `category()`-Funktion. Ich weiss nicht ob "LETTER" im Namen so zuverlässig ist.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten