Найти относительное совпадение двух строк

Я пишу функцию для сравнения двух строк (вариант использования заключается в сравнении банковской выписки с исходной строкой, созданной в момент выставления счета). Мне интересно узнать, сколько процентов (долей) меньшей строки 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 что правильно.

Теперь вопрос: есть ли более элегантный способ выполнить ту же задачу? Если я снова прочитаю этот код через несколько лет, я, вероятно, больше его не пойму...

Если ваш код работает и все, что вы хотите, это улучшить его, то вам следует опубликовать свой вопрос на codereview.stackexchange.com.

DYZ 16.12.2020 22:14

В будущем так и сделаю, спасибо за подсказку.

Marcel Sonderegger 16.12.2020 22:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Отлично, спасибо. Левенштейн также может быть вариантом, поскольку он намного короче и понятнее для чтения. У него есть и обратная сторона: в финансовых операциях обычно очень мало орфографических ошибок, но часто порядок слов меняется или сокращается. Эти два фактора дают низкий коэффициент Левенштейна, даже если информация верна.

Marcel Sonderegger 17.12.2020 08:35

в финансовых отчетах вы часто встречаете перестановку слов: «Анна Роза» попадает в «Роза Анна», которые совпадают в моем алгоритме (результат = 1), но только 0,34 в Левенштейне. Так что на данный момент я буду придерживаться своего алгоритма, даже если он уродлив. Ваш ответ дает много альтернативных результатов в Google, которые могут помочь кому-то еще. Для этого вы получаете принятый ответ.

Marcel Sonderegger 17.12.2020 19:47

Другие вопросы по теме