String-Überprüfung optimieren

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
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Um automatisch die nächste Seite durch Drücken der Return-Taste anzufordern, überprüfe ich eingehende Daten einer Telnet-Verbindung auf eine bestimmte Zeichenkette. Diese kann geringfügig unterschiedlich aussehen. Bisher habe ich das folgendermaßen getan:

Code: Alles auswählen

    self.press = 'Taste druecken ...\x1B[1;69H\x1B[0K\x1B[24;80H'
    self.press1 = 'Taste druecken ..\x1B[1;69H\x1B[0K\x1B[24;80H'
    self.press2 = 'Taste druecken \x1B[1;69H\x1B[0K\x1B[24;80H'
    self.press3 = 'Taste druecken\x1B[1;69H\x1B[0K\x1B[24;80H'
.
.
.
    elif self.CopyFlag[1].get() and (text.endswith(self.press) or
                                     text.endswith(self.press1) or
                                     text.endswith(self.press2) or
                                     text.endswith(self.press3)):
Da mir dies zu umständlich und unübersichtlich wirkte, habe ich es jetzt über eine Regex gelöst:

Code: Alles auswählen

    self.regex = re.compile('Taste druecken( \.{0,3})?'
                            '\x1B\[1;69H\x1B\[0K\x1B\[24;80H$')
.
.
.
    elif self.CopyFlag[1].get() and self.regex.search(text):
Jetzt kommt es aber vor, dass das Script gelegentlich bei Benutzung dieses Codes mit einer Windows-Fehlermeldung (keine Python-Exception) abstürzt; bei identischem Aufruf direkt danach aber ohne Fehler abläuft. Meine Vermutung ist, dass die o.g. Überprüfung, die für jedes eintreffende Zeichen durchgeführt wird, als Regex deutlich langsamer geworden ist. Gibt es eine Möglichkeit, dies schneller, aber trotzdem übersichtlich hinzubekommen?
Der Versuch

Code: Alles auswählen

    elif self.CopyFlag[1].get() and (text.endswith('\x1B[1;69H\x1B[0K\x1B[24;80H') and
                                     'Taste druecken' in text)
dürfte m.E. wohl noch langsamer sein, da unnötigerweise nicht nur das Ende des Strings, sondern der ganze String überprüft wird.
Danke
HWK
BlackJack

Kannst Du in der letzten Variante nicht `text.startswith('Taste...')` verwenden?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich glaube nicht: Wenn es nur eine Variante (z.B. self.press) gäbe, könnte ich den Text immer auf der Länge von self.press halten und dann startswith verwenden. Zum einen kostet text = text[-len(self.press):] auch Zeit, zum anderen muss ich auf 4 unterschiedlich lange Varianten überprüfen.
MfG
HWK
Antworten