Проверьте сходство форматов между двумя строками
У меня есть формат строки, который выглядит так:
- слово должно состоять из 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