Проверьте сходство форматов между двумя строками

У меня есть формат строки, который выглядит так:

  • слово должно состоять из 15 букв
  • первые 8 букв даты

Пример: '2009060712ab56c'

Допустим, я хочу сравнить это с другой строкой и указать процентное соотношение формата:

result = format_similarity('2009060712ab56c', '20070908njndla56gjhk')

результат скажем в этом случае 80%.

Есть ли способ сделать это?

2 ответа

Как отмечалось в комментариях JETM, https://pypi.org/project/python-Levenshtein/ может быть хорошим ресурсом для сравнения "близости", то есть изменения расстояния между двумя строками (сколько изменений необходимо внести в одну Строка, чтобы соответствовать другой).

Вы можете создать свою собственную реализацию "расстояния редактирования", которая соответствует вашим пользовательским правилам, таким как:

  • первые 8 символов являются числовыми и образуют правильную дату
  • общая строка из 15 символов

Ваш формат состоит из двух разных атрибутов, которые будут измеряться по-разному. Как вы объедините их в общее процентное сходство формата, было бы вопросом бизнес-логики. Например, если в начале есть пропущенное число, будет ли оно совершенно другим, потому что оно больше не является датой? Или это все еще похоже? Но вот как вы можете получить измерения:

import re 

def determine_similarity(string, other):
    length_string = len(string)  # use len to get the number of characters in the string
    length_other = len(other)
    number_of_numbers_string = _determine_number_of_numbers(string)
    number_of_numbers_other = _determine_number_of_numbers(other)

    <some logic here to create a metric of simiarity>
    <find the differences and divide them?>


LEADING_NUMBERS = re.compile(
    r"^"     # anchor at start of string
    r"[0-9]" # Must be a number
    r"+"     # One or more matches
)

def _determine_number_of_numbers(string):
    """
    Determine how many LEADING numbers are in a string
    """
    match = LEADING_NUMBERS.search(string)
    if match is not None:
        length = len(match.group()) # Number of numbers is length of number match group
    else:
        length = 0  # No match means no numbers

    <You might want to check whether the numbers constitute a date within a certain range or something like that>
    <For example, take the first four number and check whether the year is between 1980 and 2018>
    return length
Другие вопросы по тегам