2017-09-29 2 views
0

Kann bitte jemand erklären das Verhalten der get_matching_blocks()? Für das folgende Beispiel:Wie funktioniert das get_matching_blocks()?

string2 = "1234 abc efg" 
string1 = "efg abc 1234" 
match = SequenceMatcher(None, string1, string2).get_matching_blocks() 
print(match) 

es gibt das folgende Ergebnis [Match(a=3, b=4, size=5), Match(a=12, b=12, size=0)] was bedeutet, dass es

Warum es nicht zurück auch die Teilfolgen „1234“ und „efg nur die Teilfolge„abc“findet "?

Antwort

0

According to the documenatation:

Zurück Liste der Tripel passende Teilfolgen beschreibt. Jedes Tripel hat die Form (i, j, n) und bedeutet, dass a [i: i + n] == b [j: j + n]. Die Tripel nehmen in i und j monoton zu.

Die Schlüsselwörter hier sind "monoton steigend". Das bedeutet, wenn die zurückgegebene Liste die Tripel t = (i, j, n) und t' = (i', j', n') enthält, wobei t vor t' erscheint, müssen wir i <= j <= i' <= j' haben.

+0

Warum ist 'abc' das Ergebnis? Sollte 'efg' nicht die erste gefundene Sequenz sein? –

+0

@ Ame.Lia was passiert, wenn Sie die Argumente umkehren? –

+0

für Übereinstimmung = SequenceMatcher (None, string2, string1) .get_matching_blocks() Ich erhalte wieder die gleiche allgemeine Zeichenfolge, "abc". Das ist die Ausgabe: [Match (a = 4, b = 3, size = 5), Match (a = 12, b = 12, size = 0)] –

1

Die Doktoren sagen "Die Tripletts sind in i und j monoton steigend." Daher wird die Implementierung niemals rückwärts schauen, nachdem sie eine Übereinstimmung gefunden hat. Es findet "abc" und schaut nur von dort in jede Saite vorwärts.

+0

Und in diesem Fall, wie kam es zuerst "efg" gefunden und dann gestoppt? –