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

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

Beitragvon sma » Donnerstag 3. April 2008, 07:44

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:

Beitragvon mkesper » Donnerstag 3. April 2008, 08:26

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

Beitragvon sma » Donnerstag 3. April 2008, 08:44

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Donnerstag 3. April 2008, 08:55

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 3. April 2008, 09:05

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

Beitragvon BlackJack » Donnerstag 3. April 2008, 09:17

@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

Beitragvon sma » Donnerstag 3. April 2008, 09:18

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

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider]