String 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.
Antworten
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

HuHu..

konnte man in einem String nicht mehrer Zeichen gleichzeitig ersetzen?

Code: Alles auswählen

    line=line.replace("ä","ae")
    line=line.replace("Ä","Äe")
    line=line.replace("ö","oe")
    line=line.replace("Ö","oe")
irgendwie mit Listen da arbeiten, oder hab ich das falsch im Kopf?

Grüße
D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du es schon mit einzelnen "replace"-Aufrufen versuchst, dann wäre natürlich eine Schleife die endeutig bessere Löung gewesen ;-)

Schau dir mal im string-Modul die Funktionen "translate" und "maketrans" an.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ansonsten ginge noch:

Code: Alles auswählen

line=line.replace("ä","ae").replace("Ä","Äe").replace("ö","oe").replace("Ö","oe")
Aber schön ist das natürlich nicht. "Schleife" wurde ja schon als Stichwort genannt.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Ja ich weiss, war nur auf die schnelle hin getippert, damit ihr wisst was ich meine, hatte wie gesagt nur in Erinnerung das man so was auch mit Listen als Angaben irgendwie hin bekommen kann.

Das maketrans ist nicht so mein Freund. Er scheint Probleme damit zu haben die Umlate zu übersetzen, weil er der Meinung ist das die beiden Listen nicht gleichlang sind (sind sie ja auch nicht, ä=ae... wobei:) selbst wenn ich versuchen äöü ind aou zu überseten ist er der Ansicht. Aber das Thema ist ja schon in der API angedeutet, schon bei Groß und KleinSchreibung scheint es da Probleme geben zu können.

Werd einfach mal eine kleine Schleife drum binden. Wollte nur mal hören ob es für so was eine elegante Lösung giibt :)

Grüße
D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Man könnte z.B. ein Dictionary anlegen und dann über die einzelnen Elemente iterieren:

Code: Alles auswählen

chars = {'ö':'oe','ä':'ae','ü':'ue'} # usw.
line = "Irgendein lästiger, übler, öder Text."
for char in chars:
    line = line.replace(char,chars[char])
BlackJack

@da.dom:

Code: Alles auswählen

In [2]: len('äöü')
Out[2]: 6

In [3]: len('aou')
Out[3]: 3
Es kommt nicht darauf an, wie viele Buchstaben Du siehst, sondern mit wie vielen Bytes die kodiert werden. Im Fall von UTF-8 sind's halt zwei Bytes pro Umlaut.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

BlackJack hat geschrieben:Es kommt nicht darauf an, wie viele Buchstaben Du siehst, sondern mit wie vielen Bytes die kodiert werden. Im Fall von UTF-8 sind's halt zwei Bytes pro Umlaut.
Huch. Darauf wär ich mit den Docs aber nie gekommen:
len(s)
Return the length (the number of items) of an object. The argument may be a sequence (string, tuple or list) or a mapping (dictionary).
Und vor alle mit dem Beispiel im Tutorial würde ich das mit der obigen Erklärung nie erwarten, dass da die Bytes gezählt werden und nicht die einzelnen Zeichen:
The built-in function len() returns the length of a string:

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
Gibt es da einen Gedanken dahinter, warum man die Bytes "zählt""? Möchte man nicht viel häufiger einfach wissen, wie lang (= aus wie viele Zeichen) ein String ist?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

dafür gibts unicode-Strings.

`string` ist nur eine Bytefolge und ist in Py3k auch nur noch als b"foo" verfügbar.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Ah ok, danke für die Aufklärung.
BlackJack

Ich denke man möchte immer wissen wie viele Elemente in einem Sequenzobjekt stecken, damit gilt len(seq) == Anzahl der Iterationen, wenn man dass Objekt in einer Schleife verwendet. Alles andere wäre sehr überraschend.

Ausserdem kann man in diesem Beispiel gar nicht die Buchstaben zählen, denn der `str` weiss ja gar nicht ob oder das es sich um drei Umlaute handelt, denn ein `str` hat keine Kodierung, das könnte genau so gut die Zeichenfolge äöü (latin-1) oder äöü (cp1251) oder 盲枚眉 (gbk) sein. Oder einfach irgendwelche Bytes mit einer komplett anderen Bedeutung.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ich möchte hier noch unicode.translate() einwerfen -- das kann mehr als str.translate(), was natürlich aus Konsistenzsicht blöde ist, aber hier nützlich:

Code: Alles auswählen

>>> mapping = {ord(u"ü"): u"ue", ord(u"ß"): u"ss"}
>>> line = u"Grüß Gott"
>>> print line.translate(mapping)
Gruess Gott
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten