@Nobuddy: Gibt es für Deinen Code nicht *immer* eine bessere Lösung?

Die innere ``for``-Schleife ist zum heulen und/oder schreiend weglaufen. Ich bin mir ziemlich sicher, dass schon mal erwähnt wurde, dass ``for i in range(len(sequence)):`` ein „anti pattern” ist. So etwas ist mit 99,999%iger Wahrscheinlichkeit unnötig indirekt. Und dann die nächste Zeile… Mach Dir doch mal bitte klar was diese beiden Zeilen vom Konzept her tun. Und dann was die `split()`-Methode als Ergebnis liefert. Dann sollte Dir auffallen, wie viel unsinnige Arbeit in den beiden Zeilen verrichtet wird.
Dann ist es unsauber eine Datenstruktur in eine Zeichenkette umzuwandeln um dann in der Zeichenkette etwas zu suchen. Das ist ein Hack wenn man zu faul ist die Werte in der Datenstruktur einzeln zu testen und es einem nichts ausmacht, dass zusätzliche Zeichen gesucht und gefunden werden können, die eigentlich gar nicht in den Daten vorkommen, sondern nur in der Zeichenketten-Repräsentation der Datenstruktur.
Über das letzte ``if`` in dem Quelltextschnippsel könntest Du auch noch mal nachdenken. Wie oft wird das ausgeführt? Bei welcher Ausführung kommt welches Ergebnis unter welchen Vorbedingungen? Daraus dann die Schlussfolgerung ziehen welche Ausführungen man sich sparen sollte, weil da die Bedingung immer `False` werden *muss*.
Neben dem wiederholten Ausführen von Code der bei jeder Ausführung das gleiche Ergebnis liefert, und deswegen nicht dauernd wiederholt werden müsste, gibt es statisch auch wieder Code-Duplikate, nämlich die zwei identischen Zeilen im Trefferfall.
So wie die Sternchensuche implementiert ist, wird nicht auf die Reihenfolge der Teilstücke geachtet. Die Suche 'ab*cd' würde nicht nur 'abxycd' finden, sondern auch 'cdxyab'. Das ist nicht was man bei einem '*' normalerweise erwartet.
Ich würde das in Funktionen aufspalten. Eine Funktion die eine Zeichenkette, eventuell mit '*' als Platzhalter für beliebige Zeichen, in einer anderen sucht. Dann eine die eine `row` prüft. Und dann kann man das ganze mit `itertools.ifilter()` (Python 2) oder `filter()` (Python 3) auf die Daten anwenden.
Edit (ungetestet):
Code: Alles auswählen
import re
# ...
def filter_rows(search_string, rows):
test = re.compile(
'.*?'.join(re.escape(s) for s in search_string.split('*')),
re.IGNORECASE
).match
return (row for row in rows if any(test(e) for e in row))
# ...
for row in filter_rows(self.txt_line.get(), self.data):
self.see.add('\t'.join(row))
self.pool.add(tuple(row))