#python #python-3.x #pattern-matching #string-comparison #fractions
#python #python-3.x #сопоставление с образцом #сравнение строк #дроби
Вопрос:
Я пишу функцию для сравнения двух строк (вариант использования — сравнить банковскую выписку с исходной строкой, созданной в момент выставления счета). Мне интересно узнать, сколько процентов (долей) меньшей строки compareSting
находится внутри исходной строки. Необходимо учитывать как минимум 4 последовательных символа. Порядок сопоставления не имеет значения.
def relStringMatch(originalString,compareString):
smallestMatch=4
originalString=originalString.upper()
compareString=compareString.upper()
stringLength=len(compareString)
lastTest=stringLength-smallestMatch
index=0
totalMatch=0
while index < lastTest:
nbChars = smallestMatch
found=False
while (index nbChars) <= stringLength:
checkString=compareString[index:index nbChars]
if originalString.find(checkString) <0:
if (nbChars==smallestMatch): nbChars=0
nbChars-=1
break
else: found=True
nbChars =1
if found:
totalMatch =nbChars
index =nbChars
else: index =1
return totalMatch / stringLength
Код работает хорошо, в качестве примера:
relStringMatch("9999EidgFinanzverwaltungsteuer", "EIDG. FINANZVERWALTUNG")
выводит результат: 0.95
который является правильным.
Теперь вопрос: есть ли более элегантный способ выполнить ту же задачу? Если я снова прочитаю этот код через несколько лет, я, вероятно, больше не буду его понимать…
Комментарии:
1. Если ваш код работает, и все, что вы хотите, это улучшить его, тогда вам следует опубликовать свой вопрос в codereview.stackexchange.com .
2. Я сделаю это в будущем, спасибо за совет.
Ответ №1:
Не изобретая велосипед, существует ряд четко определенных показателей, которые вы можете использовать для сравнения строк и оценки сходства, например, расстояние Левенштейна:
https://en.wikipedia.org/wiki/Levenshtein_distance
Для каких библиотек python, реализующих его, уже существуют:
https://pypi.org/project/python-Levenshtein/
from Levenshtein import ratio
ratio('Hello world!', 'Holly grail!')
# 0.583333...
ratio('Brian', 'Jesus')
# 0.0
Комментарии:
1. Отлично, спасибо. Левенштейн также может быть вариантом, поскольку он намного короче и понятнее для чтения. У этого есть недостаток: в финансовых транзакциях обычно очень мало орфографических ошибок, но часто порядок слов меняется или прерывается. Эти два фактора дают низкий коэффициент Левенштейна, даже если информация верна.
2. в финансовых отчетах вы часто находите слова, заменяющие друг друга: «Анна Роза» переходит в «Роза Анна», которые совпадают в моем алгоритме (результат = 1), но только 0,34 в Левенштейне. Поэтому на данный момент я буду придерживаться своего алгоритма, даже если он уродлив. Ваш ответ дает много альтернативных результатов в Google, которые могут помочь кому-то еще. Для этого вы получаете принятый ответ.