Mehrzeiligen Input trennen

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
Cruzad0r
User
Beiträge: 3
Registriert: Montag 6. Februar 2017, 16:24

Guten Abend,

ich bin gerade dabei bspw. automatisch Aktien auf Basis einer Telegram Nachricht zu kaufen. Dazu erhalte ich die Nachricht im folgenden Layout

Aktie: Unternehmen XY
Strategie: XY
Limit: XY

Um diese Eingabewerte in den nächsten Schritten zu verwenden muss ich die übermittelten Informationen trennen, z.B. Share = Unternehmen XY, Strategy = XY usw. Die Informationen werden gebündelt übermittelt, die einzelnen Zeilen sind lediglich mit einem Zeilenumbruch getrennt. Über den Strip operator habe ich kein Ergebnis erzielen können, ließe sich dies mit Regulären Ausdrücken umsetzen?

Am Ende möchte ich beispielsweise den Wert nach "Aktien: " und vor "Strategie: " in eine separate Variable "Share" überführen usw., im Nachgang die anderen beiden Zellen.

Jegliche Tipps sind gerne gesehen.

Vielen Dank bereits im Voraus.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Cruzad0r hat geschrieben: Montag 7. Oktober 2019, 23:18 Über den Strip operator habe ich kein Ergebnis erzielen können, ließe sich dies mit Regulären Ausdrücken umsetzen?
Irgendwas wird ja bestimmt passiert sein, evtl gab es eine Fehlermeldung? Die sind meist sehr hilfreich für die Problemlösung, also Fehlermeldungen möglichst mit in den Thread kopieren.

strip() ist übrigens eine Methode auf Zeichenketten und kein Operator. Davon abgesehen braucht man es auch gar nicht. Und den Sinn von regulären Ausdrücken sehe ich hier ebenso wenig, da Python für diesen Bereich genug eigene Fähigkeiten mitbringt.

Ich würde das Parsen eine Datensatzes so angehen:

Code: Alles auswählen

data = """\
Aktie: Unternehmen XY
Strategie: XY
Limit: XY"""

result = dict(line.split(': ') for line in data.split('\n'))
print(result)
Im tatsächlichen Code halt eingebettet oder als eigene Funktion und natürlich ohne das print().

Liegen die Datensätze denn jeweils als einzelne Strings vor (so wie hier beim Beispiel)? Oder sind die alle zusammen in einem großen String verpackt? Dann stünde als nächstes die Herausforderung an, wie man diese auseinander friemelt...
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wenn man wirklich nur zwei Elemente als Ergebnis will, zweiten Parameter nicht vergessen:

Code: Alles auswählen

result = dict(line.split(': ', 1) for line in data.split('\n'))
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das nur funktioniert wenn die letzte Zeile nicht auch durch ein '\n' abgeschlossen wurde. Die `splitlines()`-Methode ist an der Stelle sicherer.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Cruzad0r: Hier mal etwas ordentlicher aufbereitet:

Code: Alles auswählen

#!/usr/bin/env python3

TEST_DATA = """\
Aktie: Unternehmen XY
Strategie: XY
Limit: XY"""

def parse_string(data):
    info = {}
    for line in data.splitlines():
        category, value = line.split(': ', 1)
        info[category] = value
    return info

def main():
    info = parse_string(TEST_DATA)
    print('Aktie =>', info['Aktie'])
    print('Strategie =>', info['Strategie'])
    print('Limit =>', info['Limit'])

if __name__ == '__main__':
    main()
Das Skript ist direkt von der Kommandozeile ausführbar. Ich vermute, dass du Anfänger bist. Es soll dir daher nur als Orientierung dienen. Du wirst dich schon etwas mehr mit Python beschäftigen müssen, da solche Aufgabenstellungen zum Grundlagenwissen gehören. Ein komplettes Programm für dein Vorhaben wird dir wahrscheinlich niemand schreiben...
Antworten