【问题标题】:Check format similarity between two strings检查两个字符串之间的格式相似性
【发布时间】:2019-04-18 13:29:44
【问题描述】:

我有一个像这样的字符串格式:

  • 单词长度必须为 15 个字母
  • 前8个字母是日期

例如:'2009060712ab56c'

假设我想将它与另一个字符串进行比较,并给出格式相似度的百分比,例如:

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

我们假设在这种情况下为 80%。

有没有办法做到这一点?

【问题讨论】:

  • “格式相似度”是什么意思? Levenshtein distance够了吗?
  • 更简单,因为 - 如果我理解正确 - 两个字符串都是 15 个字符长,只需遍历两个字符串的字符并计算其中有多少相等。
  • 它们的长度都不是 15 个字符。

标签: python string format fuzzy-comparison


【解决方案1】:

您的格式由两个不同的属性组成,它们的测量方式不同。如何将这些组合成格式的总体百分比相似性将是一个业务逻辑问题。例如,如果开始时缺少数字,现在是否完全不同,因为它不再是日期?或者它仍然相似?但您可以通过以下方式获得测量结果:

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

【讨论】:

    【解决方案2】:

    正如 JETM 在 cmets 中指出的那样,https://pypi.org/project/python-Levenshtein/ 可能是比较“接近度”的好资源,即编辑两个字符串的距离(必须对一个字符串进行多少更改才能匹配另一个字符串)。

    您可以创建自己的“编辑距离”实现,以匹配您的自定义规则,例如:

    • 前 8 个字符是数字,构成有效日期
    • 总共 15 个字符的字符串

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多