Seite 1 von 1

String ersetzen

Verfasst: Freitag 11. September 2009, 09:24
von C4S3
Hallo!

Tut mir leid, dass der Titel so wenig aussagekräftig ist, aber ich kann es nicht besser beschreiben.
(Da ich aber lernwillig bin, werde ich den Titel gerne ändern, wenn ihr eine Anregung für mich habt)

Zu meinem Problem:
Ich habe einen String (aus einer Datei eingelesen), der in etwas so aussieht:

Code: Alles auswählen

s = "#76#111#118#101#32#44#108#111#118#101#32#105
#115#32#97#32#118#101#114#98#76#111#118#101#32#105#115
#32#97#32#100#111#105#110#103#32#119#111#114#100
#70#101#97#114#108#101#115#115#32#111#110#32#109
#121#32#98#114#101#97#116#104#71#101#110#116#108
#101#32#105#109#112#117#108#115#105#111#110#83#104
#97#107#101#115#32#109"
Die Zahlen zwischen den Rauten stehen offenbar jeweils für ein Ascii-Zeichen.

Meine Frage ist, wie man effizient jeweils die Zeichen zwischen den Rauten in ein Ascii-Zeichen umwandeln kann.

Dankeschön.

Verfasst: Freitag 11. September 2009, 09:39
von EyDu
Hier mal ein Ansatz (ungetestet):

Code: Alles auswählen

"".join(map(chr, map(int, s[1:].split("#"))))
Problematisch wird es, wenn auch andere Zeichen im String enthalten sind.

Verfasst: Freitag 11. September 2009, 09:42
von cofi

Code: Alles auswählen

In [23]: ''.join(chr(int(c)) for c in s.strip('#').split('#'))
Out[23]: 'Love ,love is a verbLove is a doing wordFearless on my breathGentle impulsionShakes m'

Verfasst: Freitag 11. September 2009, 09:42
von C4S3
Vielen Dank!
Es funktioniert soweit - auch wenn ich nicht weiß, wie...

:shock:

Obwohl's immer heißt, Python sei einfach, finde ich es manchmal schon sehr kryptisch.

Verfasst: Freitag 11. September 2009, 09:53
von Darii
Wenn du wirklich nur diese Zeichen ersetzen willst und dabei keine Zeilenumbrüche etc verliegen willst ist ein regulärer Ausdruck wohl am einfachsten.

Code: Alles auswählen

>>> import re
>>> print re.sub(r"#\d+", lambda match: chr(int(match.group()[1:])), s)
Love ,love i 
s a verbLove is 
 a doing word 
Fearless on m 
y breathGentl 
e impulsionSh 
akes m
@C4S3: Wenn dir nicht klar ist, was irgendetwas macht, dann musst du „von innen nach außen“ den Code durchgehen. Nur weil Python einfach ist, heißt es nicht, dass man damit nicht auch komplizierte Sachen Ausdrücke schreiben kann. ;)

Verfasst: Freitag 11. September 2009, 10:48
von snafu
Vielleicht erscheint dir das ja lesbarer:

Code: Alles auswählen

''.join(
    (chr(int(ordinal)) for ordinal in s[1:].split('#'))
)
Sehr viel einfacher wird's kaum gehen. Es müssen halt ein paar Schritte hintereinander gemacht werden.

Man könnte sich höchstens ne wiederverwenbare split-Funktion schreiben, die etwas modifiziert ist:

Code: Alles auswählen

def split(s, seperator=None, output=str):
    clean_split = s.strip(seperator).split(seperator)
    if output == str:
        # mapping is needless here
        return clean_split
    return map(output, clean_split)

Code: Alles auswählen

In [43]: split(s, '#', int)
Out[43]: [76, 111, 118, 101, 32, 44, 108, 111, 118, 101, 32, 105]
Edit (Leonidas): Rest des Threads in "Sind Generatoren schwer verständlich?" abgetrennt.