Questo esempio confronta due stringhe, considerando gli spazi bianchi come ``spazzatura'':
>>> s = SequenceMatcher(lambda x: x == " ", ... "private Thread currentThread;", ... "private volatile Thread currentThread;")
ratio() restituisce un numero in virgola mobile in [0,1], che misura la similarità delle sequenze. A lume di naso, un valore di ratio() superiore a 0.6 indica che le sequenze hanno corrispondenze di vicinanza:
>>> print round(s.ratio(), 3) 0.866
Se siete solo interessati nel sapere dove le sequenze corrispondono, è pratico get_matching_blocks():
>>> for block in s.get_matching_blocks(): ... print "a[%d] and b[%d] match for %d elements" % block a[0] and b[0] match for 8 elements a[8] and b[17] match for 6 elements a[14] and b[23] match for 15 elements a[29] and b[38] match for 0 elements
Notate che l'ultima tupla restituita da get_matching_blocks()
è sempre fittizia, (len(a), len(b), 0)
e questo è
il solo caso in cui l'ultimo elemento della tupla (numero di elementi
che corrispondono) è 0
.
Se volete sapere come cambiare la prima sequenza nella seconda, utilizzate get_opcodes():
>>> for opcode in s.get_opcodes(): ... print "%6s a[%d:%d] b[%d:%d]" % opcode equal a[0:8] b[0:8] insert a[8:8] b[8:17] equal a[8:14] b[17:23] equal a[14:29] b[23:38]
Vedete anche la funzione get_close_matches() in questo modulo, che mostra come del semplice codice costruito su SequenceMatcher possa essere utilizzato per fare del lavoro molto utile.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.