Seite 1 von 1
Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 19:13
von YAPD
Guten Abend Zusammen,
ich würde gerne wissen, was die beste Methode ist, um Sonderzeichen herauszufiltern.
Ich habe folgende Funktion geschrieben, die genau das macht, was es soll. Ich würde
nur gerne wissen, ob es eine bessere Variante gibt.
Hier der Code :
Code: Alles auswählen
def remove_umlauts(string):
specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}
for specialcharacter in specialcharacters_store.keys():
string = string.replace(specialcharacter, specialcharacters_store[specialcharacter])
return string
print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))
Output : Der Fluss ist der Uebergang zur Stadt fuer die Bevoelkerung der Aegypter !
Ich habe auch bereits mit unidecode herumprobiert, allerdings ersetzt er hier z. B. das Ö durch
ein "O" anstatt ein "Oe".
Code: Alles auswählen
import unidecode
unaccented_string = unidecode.unidecode(SC_Vars )
print( "Results :" , unaccented_string )
Ich bin dankbar für Vorschläge.
VG
YAPD
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 19:49
von rogerb
Ich bin mir ehrlich gesagt, nicht sicher ob das die beste Methode ist, aber ich würds so machen:
Code: Alles auswählen
def remove_umlauts(string):
specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}
return "".join(specialcharacters_store.get(letter, letter) for letter in string)
print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))
Bei "replace" wird sicherlich intern jedesmal der gesamte Text abgesucht. Hier geht man nur einmal über den Text. Ist der Buchstabe ein Umlaut also im Dictionary, wird er ersetzt, wenn nicht kommt einfach der Buchstabe selbst an die entsprechende Stelle.
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 20:20
von sparrow
Wenn es darum geht bestimmte Zeichen nach einem bestimmten Schema zu ersetzen, würde ich einen Blick auf
str.translate() werfen.
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 21:07
von YAPD
sparrow hat geschrieben: Freitag 13. August 2021, 20:20
Wenn es darum geht bestimmte Zeichen nach einem bestimmten Schema zu ersetzen, würde ich einen Blick auf
str.translate() werfen.
Danke für deine Antwort. Leider bekomme ich es so nicht hin, da die auszutauschenden Zeichen die gleiche Länge
haben müssen, ich will aber Ä mit Ae , Ö mit Oe usw. ersetzen. Daher bekomme ich immer die Meldung :
Code: Alles auswählen
ValueError: the first two maketrans arguments must have equal length
VG
YAPD
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 21:25
von YAPD
rogerb hat geschrieben: Freitag 13. August 2021, 19:49
Ich bin mir ehrlich gesagt, nicht sicher ob das die beste Methode ist, aber ich würds so machen:
Code: Alles auswählen
def remove_umlauts(string):
specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}
return "".join(specialcharacters_store.get(letter, letter) for letter in string)
print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))
Bei "replace" wird sicherlich intern jedesmal der gesamte Text abgesucht. Hier geht man nur einmal über den Text. Ist der Buchstabe ein Umlaut also im Dictionary, wird er ersetzt, wenn nicht kommt einfach der Buchstabe selbst an die entsprechende Stelle.
Danke für deinen Beitrag und auch für die Erklärung.

So ist es natürlich
besser, weil es einfach Zeit spart, nur einmal über den String drüber zu gehen.
VG
YAPD
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 21:56
von Sirius3
@YAPD: genau, es ist sogar um den Faktor 0.04 mal so schnell.
Selbst translate ist noch um den Faktor 10 langsamer als Deine Variante.
Code: Alles auswählen
UMLAUT_MAPPING = str.maketrans({"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"})
def remove_umlauts(string):
return string.translate(UMLAUT_MAPPING)
Trotzdem würde ich diese Variante bevorzugen, weil sie am lesbarsten ist.
Re: Codierung von Zeichen
Verfasst: Freitag 13. August 2021, 22:09
von nezzcarth
Ich verwende dafür oft
PyICU:
Code: Alles auswählen
In [1]: import icu
In [2]: transliterator = icu.Transliterator.createInstance('de-ascii')
In [3]: transliterator.transliterate('Ä Ö Ü ä ö ü ß')
Out[3]: 'AE OE UE ae oe ue ss'
Re: Codierung von Zeichen
Verfasst: Samstag 14. August 2021, 18:47
von YAPD
Sirius3 hat geschrieben: Freitag 13. August 2021, 21:56
@YAPD: genau, es ist sogar um den Faktor 0.04 mal so schnell.
Selbst translate ist noch um den Faktor 10 langsamer als Deine Variante.
Code: Alles auswählen
UMLAUT_MAPPING = str.maketrans({"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"})
def remove_umlauts(string):
return string.translate(UMLAUT_MAPPING)
Trotzdem würde ich diese Variante bevorzugen, weil sie am lesbarsten ist.
Das heißt, du würdest sie bevorzugen, obwohl sie defacto langsamer ist ?
Ist das nicht nachteilig, wenn z.B. in einer sehr großen Textdatei alle Zeichen
ersetzt werden sollen, oder täusche ich mich da und die Unterschiede sind
gering ?
nezzcarth hat geschrieben: Freitag 13. August 2021, 22:09
Ich verwende dafür oft
PyICU:
Code: Alles auswählen
In [1]: import icu
In [2]: transliterator = icu.Transliterator.createInstance('de-ascii')
In [3]: transliterator.transliterate('Ä Ö Ü ä ö ü ß')
Out[3]: 'AE OE UE ae oe ue ss'
Danke für den Hinweis, ich muss mir das Modul auf jeden Fall anschauen
VG
YPAD
Re: Codierung von Zeichen
Verfasst: Samstag 14. August 2021, 22:27
von __blackjack__
@YAPD: Wie gross muss der Text denn werden, dass man das überhaupt merkt. Es ist halt ein sehr offensichtlicher und an sich nicht ineffizienter Weg das so zu machen. Es wird eine Methode für das benutzt wofür sie gedacht ist.