Seite 1 von 1

String Replace

Verfasst: Freitag 27. Juni 2008, 15:26
von da.dom
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

Verfasst: Freitag 27. Juni 2008, 15:37
von EyDu
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.

Verfasst: Freitag 27. Juni 2008, 15:45
von numerix
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.

Verfasst: Freitag 27. Juni 2008, 15:57
von da.dom
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

Verfasst: Freitag 27. Juni 2008, 16:41
von numerix
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])

Verfasst: Freitag 27. Juni 2008, 16:59
von 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.

Verfasst: Freitag 27. Juni 2008, 18:59
von pudeldestodes
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?

Verfasst: Freitag 27. Juni 2008, 19:09
von audax
dafür gibts unicode-Strings.

`string` ist nur eine Bytefolge und ist in Py3k auch nur noch als b"foo" verfügbar.

Verfasst: Freitag 27. Juni 2008, 19:20
von pudeldestodes
Ah ok, danke für die Aufklärung.

Verfasst: Freitag 27. Juni 2008, 20:36
von 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.

Verfasst: Samstag 28. Juni 2008, 18:58
von birkenfeld
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