Hinweis, difflib.SequenceMatcher
findet nur die längste zusammenhängende übereinstimmende Teilsequenz, dies ist oft nicht das Gewünschte, zum Beispiel:
>>> a1 = "Apfel"
>>> a2 = "Appel"
>>> a1 *= 50
>>> a2 *= 50
>>> SequenceMatcher(None, a1, a2).ratio()
0,012 # sehr niedrig
>>> SequenceMatcher(None, a1, a2).get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=250, b=250, size=0)] # nur der erste Block wird aufgezeichnet
Die Ähnlichkeit zwischen zwei Zeichenfolgen zu finden, ist eng mit dem Konzept der paarweisen Sequenzalignierung in der Bioinformatik verbunden. Es gibt viele dedizierte Bibliotheken dafür, einschließlich biopython. Dieses Beispiel implementiert den Needleman-Wunsch-Algorithmus:
>>> from Bio.Align import PairwiseAligner
>>> aligner = PairwiseAligner()
>>> aligner.score(a1, a2)
200,0
>>> aligner.algorithm
'Needleman-Wunsch'
Die Verwendung von biopython oder einem anderen Bioinformatikpaket ist flexibler als jedes Teil der Python-Standardbibliothek, da viele verschiedene Bewertungsschemata und Algorithmen verfügbar sind. Außerdem können Sie tatsächlich die übereinstimmenden Sequenzen erhalten, um zu visualisieren, was passiert:
>>> alignment = next(aligner.align(a1, a2))
>>> alignment.score
200,0
>>> print(alignment)
Apfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-Äpfel-
|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-
Äpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-elÄpf-el