Проверьте сходство форматов между двумя строками - PullRequest
0 голосов
/ 15 ноября 2018

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

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

Пример:'2009060712ab56c'

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

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

В этом случае, скажем, 80%.

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

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

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

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

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

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

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
...