代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

正则表达式模糊匹配,只允许模糊范围内

  •  0
  • Jack Arnestad  · 技术社区  · 5 年前

    我有一个 pattern_string = 'ATAG/GAGAAGATGATG/TATA' 还有一个 query_string = 'ATAG/AGCAAGATGATG/TATA'

    r = regex.compile('(%s){e<=2}' % pattern_string)
    
    r.match(query_string)
    

    在这里,唯一的改变是在两者之间 / 字符。但是,我想限制匹配的模糊性,只允许在这些字符之间,而 边界保持完全匹配。

    例如, pattern_string = 'ATGG/GAGAAGATGATG/TATA' query_string='ATAG/agcaagatg/TATA' ATGG ATAG )不匹配。同样, pattern_string = 'ATAG/GAGAAGATGATG/TATG' query_string='ATAG/agcaagatg/TATA' TATG TATA )不匹配。

    总之,字符串在 / (或任何分隔符字符)应根据指定给正则表达式的内容允许模糊匹配( {e<=2} 在本例中),但外部的字符串必须完全匹配。

    如何做到这一点?

    我在想象一个像下面这样的函数

    ideal_function(pattern_string, query_string)
    

    在哪里?

    ideal_function(pattern_string = 'ATAG/GAGAAGATGATG/TATA', query_string = 'ATAG/AGCAAGATGATG/TATA') 退货 True ideal_function(pattern_string = 'ATGG/GAGAAGATGATG/TATA', query_string = 'ATAG/AGCAAGATGATG/TATA') 退货 False

    {s<=2} )和错误计数(如 {e<=2}

    0 回复  |  直到 5 年前
        1
  •  1
  •   Zero Piraeus    5 年前

    您可以使用下面所需的实现将模糊性限制在斜杠之间的模式部分 ideal_function() :

    def ideal_function(pattern_string, query_string, fuzzy='e<=2'):
        prefix, body, suffix = pattern_string.split('/')
        r = regex.compile('%s/(%s){%s}/%s' % (prefix, body, fuzzy, suffix))
        return r.match(query_string) is not None
    

    这就是它的作用:

    >>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA')
    True
    

    >>> ideal_function('ATGG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA')
    False
    

    >>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 'e<=1')
    False
    

    >>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 'e<=2')
    True
    

    >>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 's<=2')
    False
    

    >>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 's<=3')
    True
    

    这依赖于在模式中始终有三个斜杠分隔的部分,但是由于任何更一般化的部分也需要指定哪些部分是模糊的,哪些部分是非模糊的,我假设这种直接的方法适合您的用例。

    任何版本的 理想函数() 顺便说一句,每次调用它时都必须创建适当的正则表达式,这可能不是最有效的方法(尽管您必须进行一些分析,以确定它在您的特定情况下实际产生了多大的差异)。

    根据你需要的输出类型,像这样 可以 更有意义:

    def ideal_generator(pattern_string, all_query_strings, fuzzy='e<=2'):
        prefix, body, suffix = pattern_string.split('/')
        r = regex.compile('%s/(%s){%s}/%s' % (prefix, body, fuzzy, suffix))
        for query_string in all_query_strings:
            if r.match(query_string) is not None:
                yield query_string
    

    pattern_string