Пример решения с использованием стандартной библиотеки
difflib:
from difflib import get_close_matches as gcm
model = 'A 170 Classic - 7/2004 - 85Kw'.upper()
model_list = map(str.upper, [
'A 170 CDI CAT ELEGANCE',
'A 170 CDI CAT CLASSIC',
'A 170 CDI CAT AVANTGARDE',
])
result = gcm(model, model_list, n=1, cutoff=0.5)[0]
print(result) # => 'A 170 CDI CAT CLASSIC'
Также посмотрите в сторону difflib.SequenceMatcher().ratio(), это имеет прямое отношение к cutoff в примере выше:
from difflib import SequenceMatcher as SM
s1 = 'A 170 Classic - 7/2004 - 85Kw'.upper()
s2 = 'A 170 CDI CAT CLASSIC'.upper()
SM(isjunk=None, a=s1, b=s2, autojunk=True).ratio() # => 0.52
Теория:
Расстояние Левенштейна