re.sub Parameter

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.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 19:38

Hallo

ich habe ein kleines Problem. Was muss ich bei einem Aufruf von re.findall() z.B.

Code: Alles auswählen

sign = re.findall("^[A-Za-z]", word)
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.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 20. November 2004, 19:53

Was ist wenn du es anders herrum machst und schließt alle anderen Zeichen aus???
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 20:05

Mach ich ja, aber dann wird öüä und éàè und ÉÈÀ und ÖÄÜ nicht als Buchstabe gezählt, was ja das Ziel wäre.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 20. November 2004, 20:33

Hi. Soweit ich sehe machst du das eben nicht :wink: ... 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...
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 21:17

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

Samstag 20. November 2004, 21:23

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:

Code: Alles auswählen

print "".join([chr(i) for i in range(255)])
(Mußt natürlich einmal per Hand die Zeichen löschen, die nicht rein kommen sollen...
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 21:35

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?
Zuletzt geändert von Clython am Sonntag 21. November 2004, 10:03, insgesamt 2-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 20. November 2004, 22:12

Na, dann mach doch einfach:

Code: Alles auswählen

sign = re.findall("[A-Za-zŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüý]", word)
:lol:
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 22:21

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.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 20. November 2004, 22:27

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. :roll: (tut mir leid, aber das hilft net weiter und verbraucht massig viel Platz).
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Samstag 20. November 2004, 22:50

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

Samstag 20. November 2004, 23:46

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"
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Sonntag 21. November 2004, 09:48

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]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Sonntag 21. November 2004, 09:52

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 :wink: . Nimm lieber die methode replace, die ist auch einfacher zu rufen:

Code: Alles auswählen

text="Schmödeldödel"
text=text.replace("ö","oe")
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.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Sonntag 21. November 2004, 10:17

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.
Antworten