Seite 1 von 1
re.sub Parameter
Verfasst: Samstag 20. November 2004, 19:38
von Clython
Hallo
ich habe ein kleines Problem. Was muss ich bei einem Aufruf von re.findall() z.B.
angeben, wenn ich will, dass er mir alle Buchstaben (auch mit Umlauten, franz., span. etc. Sonderzeichen [äöü, àéè etc.]) als Buchstaben erkennt?
Hab verschiedene Sachen ausprobiert, bin aber auf keinen grünen Zweig gekommen.
Verfasst: Samstag 20. November 2004, 19:53
von jens
Was ist wenn du es anders herrum machst und schließt alle anderen Zeichen aus???
Verfasst: Samstag 20. November 2004, 20:05
von Clython
Mach ich ja, aber dann wird öüä und éàè und ÉÈÀ und ÖÄÜ nicht als Buchstabe gezählt, was ja das Ziel wäre.
Verfasst: Samstag 20. November 2004, 20:33
von Milan
Hi. Soweit ich sehe machst du das eben nicht

... Mir ist jedenfalls keine Methode bekannt, wie du es anders realisieren könntest, es sei denn du definierst in einem Sring explizit alle als Buchstaben zu erkennenden Sonderzeichen (wozu auch Umlaute zählen). Parameter dafür gibt es jedenfalls nicht...
Verfasst: Samstag 20. November 2004, 21:17
von Clython
Das Ansteuern per z.B. zeile = replace(zeile, "ä", "auml") funktioniert auch nicht. Deshalb Frage:
Mit welchen Befehl finde ich die Escape-Sequenz (\XXX) eines Zeichens?
Re: re.sub Parameter
Verfasst: Samstag 20. November 2004, 21:23
von jens
Clython hat geschrieben:wenn ich will, dass er mir alle Buchstaben (auch mit Umlauten, franz., span. etc. Sonderzeichen [äöü, àéè etc.]) als Buchstaben erkennt?
Gegenfrage noch mal, welche Zeichen willst du denn getrennt von den Buchstaben haben?
Kannst du hat diese Zeichen "Maskieren" ?
Oder erstelle dir eine Liste aller zulässigen Zeichen:
(Mußt natürlich einmal per Hand die Zeichen löschen, die nicht rein kommen sollen...
Verfasst: Samstag 20. November 2004, 21:35
von Clython
Alle die, die kein Buchstabe sind.
Wenn du mit Maskieren in eine andere Zeichenfolge verwandeln meinst, hab ich auch schon versucht...
Erstaunlicherweise zeigt mir der Python-Prompt immer was anderes an. Wenn ich ö benutze, zeigt er ÷ an, wenn ich é benutze, zeigt er ù an. Woran liegt das?
Verfasst: Samstag 20. November 2004, 22:12
von jens
Na, dann mach doch einfach:
Code: Alles auswählen
sign = re.findall("[A-Za-zŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüý]", word)

Verfasst: Samstag 20. November 2004, 22:21
von Clython
Hab schon verschiedene Varianten davon versucht. Funktioniert nicht!
Die Liste oben, wurde übrigens mit:
Code: Alles auswählen
outfile = open("char.txt", "w")
for i in range(256):
zeile = str(i) + " " + chr(i) + "\n"
outfile.write(zeile)
outfile.close()
erstellt.
Verfasst: Samstag 20. November 2004, 22:27
von Milan
Clython hat geschrieben:Hab schon verschiedene Varianten davon versucht. Funktioniert nicht!
Wie lautet denn die Ausgabe von re.findall?
In welcher Umgebung wird Python gerufen? (Win? --> DOS-Shell oder IDLE? Linux? --> Console?) je nachdem verwendet Python verschiedene Zeichensätze.
Was beinhaltet Zeile?
ps: das oben ist ne Asciiliste, das sollte eigentlich klar sein. Die nächste so schöne lange Liste lösche ich, da man sie als unnötigen Spam ansehen kann.

(tut mir leid, aber das hilft net weiter und verbraucht massig viel Platz).
Verfasst: Samstag 20. November 2004, 22:50
von Clython
Ich benutze die DOS-Shell, bin mir aber durchaus bewusst, dass es eine riesen Differenz ist, zwischen was ich sehe und was Datenmässig tatsächlich vorhanden ist...
Idle spuckt das gleiche aus wie die Shell:
Code: Alles auswählen
IDLE 1.0.3
>>> import re
>>> res = re.findall("ö", "Schmödeldödel")
>>> print res
['\xf6', '\xf6']
Übrigens auch noch interessant:
Code: Alles auswählen
>>> res = replace("\xf6", "oe", res)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in -toplevel-
res = replace("\xf6", "oe", res)
File "d:\python23\lib\string.py", line 370, in replace
return s.replace(old, new, maxsplit)
TypeError: expected a character buffer object
Und nur so als Kommentar, die Liste verbraucht gerade mal ca. 1500 Byte. Ich denke das wird die Datenbank noch verkraften...
Verfasst: Samstag 20. November 2004, 23:46
von jens
Clython hat geschrieben:
Erstaunlicherweise zeigt mir der Python-Prompt immer was anderes an. Wenn ich ö benutze, zeigt er ÷ an, wenn ich é benutze, zeigt er ù an. Woran liegt das?
Liegt vielleicht an verschiedenen Zeichensätze? Such mal im Forum nach "codec"
Verfasst: Sonntag 21. November 2004, 09:48
von Clython
Hab da was lustiges gefunden, das Dookie mal gepostet hatte:
Code: Alles auswählen
import sys
encoding = sys.getfilesystemencoding()
a = u"Hallö"
print encoding, repr(a.encode(encoding))
print "utf-8", repr(a.encode("utf-8"))
print "latin-1", repr(a.encode("latin-1"))
Damit sollte es eigentlich gehen.
Aber wozu ist eigentlich repr() gut?[/code]
Verfasst: Sonntag 21. November 2004, 09:52
von Milan
Clython hat geschrieben:Idle spuckt das gleiche aus wie die Shell:
Code: Alles auswählen
IDLE 1.0.3
>>> import re
>>> res = re.findall("ö", "Schmödeldödel")
>>> print res
['\xf6', '\xf6']
IDLE hat doch genau das gemacht, was du gesagt hast... finde alle "ö" also gibt er dir alle ö zurück, die im Text vorkommen.
Übrigens auch noch interessant:
Code: Alles auswählen
>>> res = replace("\xf6", "oe", res)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in -toplevel-
res = replace("\xf6", "oe", res)
File "d:\python23\lib\string.py", line 370, in replace
return s.replace(old, new, maxsplit)
TypeError: expected a character buffer object
replace(str, old, new[, maxreplace])
Return a copy of string str with all occurrences of substring old replaced by new. If the optional argument maxreplace is given, the first maxreplace occurrences are replaced.
Replace als Funktion des Moduls String ist veraltet. wie du aus der obigen Syntax erkennen kannst, hast du ihm gerade gesagt, er soll im String "ö" alle "oe" durch res ersetzen. Ich glaube kaum, dass das du das so ausdrücken wolltest

. Nimm lieber die methode replace, die ist auch einfacher zu rufen:
Und nur so als Kommentar, die Liste verbraucht gerade mal ca. 1500 Byte. Ich denke das wird die Datenbank noch verkraften...
Ist dafür aber 255 Zeilen lang, ohne dass man was über das Problem erfährt... Das hab ich zum Beipsiel erst gerade eben durch dein Codestückchen.
Verfasst: Sonntag 21. November 2004, 10:17
von Clython
Clython hat geschrieben:Hab da was lustiges gefunden, das Dookie mal gepostet hatte:
Code: Alles auswählen
import sys
encoding = sys.getfilesystemencoding()
a = u"Hallö"
print encoding, repr(a.encode(encoding))
print "utf-8", repr(a.encode("utf-8"))
print "latin-1", repr(a.encode("latin-1"))
Damit sollte es eigentlich gehen.
Aber wozu ist eigentlich repr() gut?[/code]
Das hilft mir aber damit noch nicht weiter. Wozu ist jetzt dieses repr() gut. Python.org gibt keine brauchbare Auskunft.
Verfasst: Freitag 7. März 2008, 10:52
von g4borg
1. repr ruft __repr__() des objektes auf. den unterschied zu str() hab ich noch nicht ganz gecheckt, sorry.
check:
>>>repr(None)
'None'
2. hast du den flag re.L mal genauer angesehen?
also re.I und re.L wären sicher mal eine hilfe, würde aber nur die sonderzeichen aus deiner sprache mit \b und \w rausfiltern. womöglich genügt das? kommt natürlich aufs programm an.
3. unicode sequenzen findest du unter windows mit der zeichentabelle. vorsicht ist nur bei manchen schreibweisen im source zu beachten, denn sie können oktal sein. \223 ist oktal (danke adobe), ich denke \x223 aber hex.
Verfasst: Freitag 7. März 2008, 12:07
von audax
Code: Alles auswählen
In [26]: re.findall("(\w+)", "Käse kuchen Kartöffel Kar23132", re.UNICODE)
Out[26]: ['K\xc3', 'se', 'kuchen', 'Kart\xc3', 'ffel', 'Kar23132']
So in etwa?
Verfasst: Freitag 7. März 2008, 13:04
von BlackJack
Leute, euch ist schon klar, dass ihr auf einen vier Jahre alten Beitrag antwortet!?

Verfasst: Freitag 7. März 2008, 13:08
von audax
Oh. Mist.
G4borg, du bist doof.
Verfasst: Freitag 7. März 2008, 16:45
von g4borg
hab danach gesucht und es erst am ende bemerkt
sry
oder...
