Regular expressions und umlaute

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Montag 12. März 2007, 14:04

Hallo Forum,

ich möchte einen Text zerlegen und alle Wörter herausbekommen, die mit einem beginnstring beginnen. mit normalen Zeichen geht das ja, nur
mit den Umlauten happerts.

Hier sollten alles Wörter beginnend mit 'ä' in eine Liste kommen:

Code: Alles auswählen

text= "jdjsafä äöoiiii ääoool uzu opäll"
findandcompleteregex1 = re.compile(r"\b" + 'ä' + r"\S*", re.MULTILINE|re.IGNORECASE)
r=findandcompleteregex1.findall(text)
r
['\xe4', '\xe4ll']
Leider werden anscheinend die Wörter zerlegt.

Wer kann mir einen regexstring (wenn nicht möglich) etwas längeres
vorschlagen, das mir einwandfrei und zuverlässig teilt?

Danke,
BlackJack

Montag 12. März 2007, 14:34

'\b' erkennt die leere Zeichenkette zwischen einem "Wortzeichen" und einem "Nicht-Wortzeichen". Da '\xe4' nicht zu den "Wortzeichen" zählt, gibt es nur zwei Stellen in `text` wo die "Lücke" von einem '\xe4' gefolgt wird. Habe ich übrigens absichtlich so geschrieben, weil es sich um ein Byte mit dem Wert 0x4e handelt was bei Dir zufällig als 'ä' dargestellt wird.

Alternative zu `re`:

Code: Alles auswählen

In [56]: text = 'jdjsafä äöoiiii ääoool uzu opäll'

In [57]: filter(lambda w: w.startswith('ä'), text.split())
Out[57]: ['\xc3\xa4\xc3\xb6oiiii', '\xc3\xa4\xc3\xa4oool']
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. März 2007, 15:01

Hallo Francesco!

Hier noch die Variante mit RE:

Code: Alles auswählen

>>> import re
>>> re.UNICODE
32
>>> text= u"jdjsafä äöoiiii ääoool uzu opäll"
>>> r = re.compile(ur"\b" + u'ä' + ur"\S*", re.MULTILINE|re.IGNORECASE | re.UNICODE)
>>> r.findall(text)
[u'\xe4\xf6oiiii', u'\xe4\xe4oool']
>>> 
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Montag 12. März 2007, 16:53

gerold hat geschrieben:Hallo Francesco!

Hier noch die Variante mit RE:

Code: Alles auswählen

>>> import re
>>> re.UNICODE
32
>>> text= u"jdjsafä äöoiiii ääoool uzu opäll"
>>> r = re.compile(ur"\b" + u'ä' + ur"\S*", re.MULTILINE|re.IGNORECASE | re.UNICODE)
>>> r.findall(text)
[u'\xe4\xf6oiiii', u'\xe4\xe4oool']
>>> 
lg
Gerold
:-)
Hallo ich danke euch beiden, ich nehme gerolds lösung!
Antworten