kleine Frage zu '' replace() ''

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

kleine Frage zu '' replace() ''

Beitragvon EnTeQuAk » Sonntag 29. Oktober 2006, 10:35

Hallo!

Ich muss in einer Variable '' content '' mehrere Sachen ersetzen. Sie soll als HTML ausgegeben werden wordurch ich Sachen wie '' äÄöÖüÜ '' ersetzen muss.

Wie ich mitbekommen kann ich das nicht einfach mit

Code: Alles auswählen

>>> content = 'üÜöÖäÄ'
>>> content.replace('ä', 'ä', 'Ä', 'Ä', 'ü', 'ü', 'Ü', 'Ü', 'ö', 'ö', 'Ö', 'Ö')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: replace() takes at most 3 arguments (12 given)


Wie könnte ich das lösen? Gibt es fertige Module dafür?

MfG EnTeQuAk
BlackJack

Beitragvon BlackJack » Sonntag 29. Oktober 2006, 10:51

Bei der `encode()`-Methode von Unicode-Objekten kann man verschiedene Möglichkeiten wählen, was passieren soll, wenn ein Zeichen in der gewünschten Kodierung nicht dargestellt werden kann. Unter anderem kann man sie durch "XML character references" darstellen lassen:

Code: Alles auswählen

In [11]: print a
üÜöÖäÄ

In [12]: a.encode('ASCII', 'xmlcharrefreplace')
Out[12]: 'üÜöÖäÄ'
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Sonntag 29. Oktober 2006, 11:11

Das erste Codestück funktioniert in dieser Form wie gedacht (ist aber nicht die optimale Lösung):

Code: Alles auswählen

for old, new in (
    ('ä', 'ä'),
    ('Ä', 'Ä'),
    ('ü', 'ü'),
    ('Ü', 'Ü'),
    ('ö', 'ö'),
    ('Ö', 'Ö')):
    content = content.replace(old, new)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 29. Oktober 2006, 12:16

Gut ;) Yogis Lösung... klappt schonmal nicht so, wie ich es dachte.

Aber die von BlackBird schaut doch sehr schön aus :D

Allerdings erhalte ich in der Console einen Fehler:

Code: Alles auswählen

>>> a = 'üÜöÖäÄ'
>>> print a
üÜöÖäÄ
>>> a.encode('ASCII', 'xmlcharrefreplace')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)


Woran liegt das?

MfG EnTeQuAk
Crush
User
Beiträge: 44
Registriert: Montag 1. Mai 2006, 11:32

Beitragvon Crush » Sonntag 29. Oktober 2006, 12:23

Code: Alles auswählen

>>> a = u'üÜöÖäÄ'
>>> a.encode('ASCII', 'xmlcharrefreplace')
'üÜöÖäÄ'
>>>


wenn a ein unicode-String ist, sollte es klappen.

Crush
Zuletzt geändert von Crush am Sonntag 5. November 2006, 14:55, insgesamt 2-mal geändert.
BlackJack

Beitragvon BlackJack » Sonntag 29. Oktober 2006, 13:34

Das Ergebnis von Deinem `encode()` glaube ich nicht. ;-)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 29. Oktober 2006, 13:39

Is aber so :D

Aber so weit ich es jetz geschafft habe klappt die Variante von Crush ganz gut.

Allerdings hab ichs mir doch noch etwas "einfacher" und "erweiterbarer" gemacht.

Also Danke schonmal für die Hilfe!


MfG EnTeQuAk
Crush
User
Beiträge: 44
Registriert: Montag 1. Mai 2006, 11:32

Beitragvon Crush » Sonntag 29. Oktober 2006, 15:48

BlackJack hat geschrieben:Das Ergebnis von Deinem `encode()` glaube ich nicht. ;-)


edit: argh... erwischt :lol:

aber nun doch noch die Frage: wie konntest du das ganze weiter oben posten (die Ausgabe), ohne dass die Zeichencodes durch "öÖü..." ersetzt werden?!

Crush
BlackJack

Beitragvon BlackJack » Sonntag 29. Oktober 2006, 21:59

Äh, hab ich eben einfach gemacht. In [ code ]-Blöcken werden diese character references nicht interpretiert, also das & vom Board escaped.

Wer ist online?

Mitglieder in diesem Forum: pillmuncher