Liste nach bestimmten Zeichen durchsuchen

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
djonny
User
Beiträge: 15
Registriert: Mittwoch 15. Juli 2009, 10:40

Hallo,

bin gerade an einem Problem angelangt, wo ich nicht weiter weiß und auch die suche nicht wirklich weiterhilft.
Ich steuere pyserial ein MC35i (GSM Modem) an.

Von diesem Modem lese ich SMS aus und bekomme eine Liste zurück.

Diese Liste sieht ungefähr so aus:

Code: Alles auswählen

['AT+CMGF=1\r\r\n', 'OK\r\n', 'AT+CMGL="REC UNREAD"<CR>\r\r\n', '+CMGL: 1,"REC UNREAD","+43xxxxx",,"11/05/09,19:30:55+08"\r\n', '*hallo*\r\n', '+CMGL: 2,"REC UNREAD","+43xxxxx",,"11/05/09,19:30:59+08"\r\n', 'Test\r\n', '+CMGL: 3,"REC UNREAD","+43xxxxx",,"11/05/09,19:31:31+08"\r\n', '*test*\r\n', '\r\n', 'ERROR\r\n']
Mein Problem was ich jetzt habe ist ich brauche nur die Nachricthen die von 5 bestimmten Nummern (ist eine Liste vorhanden) kommen und die Nachricht mit * beginnt und mit * aufhört.

muss ich jetzt alle Elemente zu einem String umwandeln und denn dann durchsuchen oder gibt es da eine bessere elegantere Möglichkeit?

Ich hoffe Ihr könnt mir helfen
tia djonny
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

die Elemente Deiner Liste sind bereits strings, da muss Du nichts mehr umwandeln.

Anhand Deines Beispiels kann ich jetzt leider nicht erkennen, welche Nachrichten zu welcher Nummer gehört.

Aber ich denke mal, dass Du mit Hilfe des 're'-Moduls oder evtl. auch nur mit dem 'in/not in-Operator Deine Infos finden solltest...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
djonny
User
Beiträge: 15
Registriert: Mittwoch 15. Juli 2009, 10:40

Danke das mit den Regular Expressions werd ich mir ansehen.

bzgl. das Beispiel also am Anfang von einer SMS kommt immer die "REC UNREAD" oder "REC READ" danach die nummer, datum und dann die Nachricht
also am besten gesagt die Nachricht 1 geht von +CMGL: 1 bis exklusive +CMGL: 2; Nachricht 2 beginnt von +CMGL: 2 bis +CMGL: 3

Hat sonst noch wer eine Lösungsmöglichkeit für mich?
oder kennt sich wer mit der Seriellen Steuerung von GSM Modulen aus und kann mir sagen wie ich eine schönere Ausgabe bekomme?

Danke
Jonny
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

was verstehst Du unter 'schönere Ausgabe'? Ich hab' Dich so verstanden, dass Du einen Pool an Nummern hast, deren Nachrichten, die mit einem '*' beginnen und enden, ermittelt werden sollen.

Ich würde also zuerst einen regulären Ausdruck für die Nummern und einen für den Nachrichtentext erstellen.
Wenn Du dann über Deine Liste iterierst, überprüfst Du jedes mal, wenn ein Nachrichtentext auf das Schema passt, ob die davorstehende Nummer in Deinem Pool vorhanden ist. Wenn ja, gibst Du die Nummer samt Nachricht aus.

Folgendes Beispiel, das natürlich noch um die Abfrage der passenden Nummer erweitert werden muss, gibt Dir alle Nachrichtentexte, die mit einem '*' beginnen und enden, aus.

Code: Alles auswählen

message_pattern = re.compile('\*(.*)\*')

for element in modem_output:
    match = re.match(message_pattern, element)
    if match:
        print match.group()
Eine andere Möglichkeit wäre es, zuerst alle zusammengehörenden Elemente (erstes Element = '+CMGL', letztes Element = Nachrichtentext) zu gruppieren und mit den Gruppen weiterzuarbeiten.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
djonny
User
Beiträge: 15
Registriert: Mittwoch 15. Juli 2009, 10:40

Danke für die Hilfe, das klappt super!

mit schönerer Ausgabe hab ich gemeint ob es vlt. irgendwie möglich ist die Nachrichten eben schon bei der Ausgabe vom Modem zu gruppieren.

Werd jetzt aber probieren das zu gruppieren damit nummer und nachricht in einer Gruppe sind und ich dann besser überprüfen kann ob diese Nachricht auch zu der Nummer passt.

Vielen Dank nochmals für den Tipp mit re und für das schöne Beispiel
Antworten