String 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
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

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.
Gruß!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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'
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

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.
Gruß!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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. ;)
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten