4.4.2 Esempi di SequenceMatcher

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.