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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.
g4borg
User
Beiträge: 16
Registriert: Donnerstag 4. Oktober 2007, 20:38

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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?
BlackJack

Leute, euch ist schon klar, dass ihr auf einen vier Jahre alten Beitrag antwortet!? ;-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Oh. Mist.

G4borg, du bist doof.
g4borg
User
Beiträge: 16
Registriert: Donnerstag 4. Oktober 2007, 20:38

hab danach gesucht und es erst am ende bemerkt

sry :D

oder...

:twisted:
Antworten