Seite 1 von 1

String-Überprüfung optimieren

Verfasst: Sonntag 30. September 2007, 10:33
von HWK
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

Verfasst: Sonntag 30. September 2007, 10:59
von BlackJack
Kannst Du in der letzten Variante nicht `text.startswith('Taste...')` verwenden?

Verfasst: Sonntag 30. September 2007, 11:27
von HWK
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