Seite 1 von 1

Liste nach bestimmten Zeichen durchsuchen

Verfasst: Montag 9. Mai 2011, 19:20
von djonny
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

Re: Liste nach bestimmten Zeichen durchsuchen

Verfasst: Montag 9. Mai 2011, 19:41
von mutetella
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

Re: Liste nach bestimmten Zeichen durchsuchen

Verfasst: Montag 9. Mai 2011, 20:50
von djonny
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

Re: Liste nach bestimmten Zeichen durchsuchen

Verfasst: Dienstag 10. Mai 2011, 08:14
von mutetella
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

Re: Liste nach bestimmten Zeichen durchsuchen

Verfasst: Mittwoch 11. Mai 2011, 07:57
von djonny
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