Codierung von Zeichen

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
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wenn es darum geht bestimmte Zeichen nach einem bestimmten Schema zu ersetzen, würde ich einen Blick auf str.translate() werfen.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

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'
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten