mehrere Zeichen ersetzen

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
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Hi,

ich habe ein kleines Script geschrieben um mir die Pflege der Daten auf einer Homepage zu erleichtern. Hier soll auch unter anderem ein kurzer Text als Überschrift / bzw Linkbeschriftung dazu. Da dieser Text allerdings weder Umlaute noch andere Sonderzeichen enthalten darf wollte ich diese durch die entsprechenden html-codes ersetzen...dafür habe ich das hier:

Code: Alles auswählen

    def generate_shortcode(self):
        replaced_short_text = ""
        replacements = {
            'ä': 'ä',
            'ü': 'ü',
            'ö': 'ö',
            'ß': 'ß',
            '°': '°',
            '<': '&lt;',
            '>': '&gt;'
        }
        for letter in replacements:
            replaced_short_text = self.short_text.replace(letter, replacements[letter])
            
        return f'...{replaced_short_text}...'
Scheinbar hab ich irgendwo einen Denkfehler. Er gibt mir den Text ohne Ersetzung zruück.

Danke

Paddie
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du nimmst immer self.short_text und ersetzt jeweils ein Zeichen, bleibt also zum Schluß nur das Ersetzen des letzten Replacements.

Code: Alles auswählen

    REPLACEMENTS = {
        'ä': '&auml;',
        'ü': '&uuml;',
        'ö': '&ouml;',
        'ß': '&szlig;',
        '°': '&deg;',
        '<': '&lt;',
        '>': '&gt;'
    }

    def generate_shortcode(self):
        replaced_short_text = self.short_text
        for letter, code in self.REPLACEMENTS.items():
            replaced_short_text = replaced_short_text.replace(letter, code)
        return f'...{replaced_short_text}...'
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@paddie: Du nimmst immer wieder den gleichen Text als Ausgang und nicht den wo schon die vorherigen Ersetzungen gemacht wurden. Das heisst am Ende hast Du nur die Ersetzung die im letzten Schleifendurchlauf gemacht wurde.

Statt selbst so eine kurze, unvollständige Ersetzungstabelle zu erstellen, gibt es im `html.entities`-Modul eine vollständige Liste. Und ich würde das auch eher nicht in einer Schleife über die Ersetzungspaare lösen, sondern entweder mit einer Schleife über den Text — falls er relativ kurz ist — oder mit `re.sub()`. Denn in die Liste gehört auch & selbst rein und das muss auch als erstes ersetzt werden.

Andererseits: Warum ersetzt Du "ä" und Co? Also warum darf der Text angeblich keine Umlaute enthalten? Das geht in HTML nämlich durchaus. Einzig "&" und "<" muss man extra behandeln. Aus Symmetriegründen ersetzt man gerne noch ">". Und falls das in Attribute eingesetzt werden können soll noch " und '. Und dafür gibt es bereits `html.escape()` aus der Standardbibliothek, das muss man sich nicht selbst schreiben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Sirius3 hat geschrieben: Montag 12. April 2021, 11:13 Du nimmst immer self.short_text und ersetzt jeweils ein Zeichen, bleibt also zum Schluß nur das Ersetzen des letzten Replacements.

Code: Alles auswählen

    REPLACEMENTS = {
        'ä': '&auml;',
        'ü': '&uuml;',
        'ö': '&ouml;',
        'ß': '&szlig;',
        '°': '&deg;',
        '<': '&lt;',
        '>': '&gt;'
    }

    def generate_shortcode(self):
        replaced_short_text = self.short_text
        for letter, code in self.REPLACEMENTS.items():
            replaced_short_text = replaced_short_text.replace(letter, code)
        return f'...{replaced_short_text}...'
Hi Sirius,

Danke..., jetzt wo ich deine Lösung sehe ists natürlich klar .... :oops: :oops:
Zuletzt geändert von paddie am Montag 12. April 2021, 12:12, insgesamt 2-mal geändert.
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

__blackjack__ hat geschrieben: Montag 12. April 2021, 11:29 @paddie: Du nimmst immer wieder den gleichen Text als Ausgang und nicht den wo schon die vorherigen Ersetzungen gemacht wurden. Das heisst am Ende hast Du nur die Ersetzung die im letzten Schleifendurchlauf gemacht wurde.
Statt selbst so eine kurze, unvollständige Ersetzungstabelle zu erstellen, gibt es im `html.entities`-Modul eine vollständige Liste. Und ich würde das auch eher nicht in einer Schleife über die Ersetzungspaare lösen, sondern entweder mit einer Schleife über den Text — falls er relativ kurz ist — oder mit `re.sub()`. Denn in die Liste gehört auch & selbst rein und das muss auch als erstes ersetzt werden.
html.entities kannte ich gar nicht :wink:, deshalb.
Andererseits: Warum ersetzt Du "ä" und Co? Also warum darf der Text angeblich keine Umlaute enthalten? Das geht in HTML nämlich durchaus. Einzig "&" und "<" muss man extra behandeln. Aus Symmetriegründen ersetzt man gerne noch ">". Und falls das in Attribute eingesetzt werden können soll noch " und '. Und dafür gibt es bereits `html.escape()` aus der Standardbibliothek, das muss man sich nicht selbst schreiben.
Das ist ein Plugin für Wordpress, ich hab es vorher MIT Umlauten und den Sonderzeichen versucht und damit hats dann das komplette Layout zerschossen... Im Moment muß ich leider noch mit diesen Plugins leben. Über kurz oder Lang soll das aber umgebaut werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@paddie: Bist Du sicher, dass das die Umlaute waren und nicht nur "<" und "&"?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

__blackjack__ hat geschrieben: Montag 12. April 2021, 12:32 @paddie: Bist Du sicher, dass das die Umlaute waren und nicht nur "<" und "&"?
Hmm...jetzt wo du es sagst hab ich das mit den Umlauten grade nochmal probiert... Jetzt weiß ich grade gar nicht mehr, wieso ich beim letzten Mal damit Probleme hatte.
Antworten