如何仅为模式的一部分提供模糊正则表达式匹配?

问题描述 投票:2回答:1

我有一个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/AGCAAGATGATG/TATA'不匹配,因为字符串的第一部分(ATGG vs ATAG)不匹配。同样,pattern_string = 'ATAG/GAGAAGATGATG/TATG'query_string = 'ATAG/AGCAAGATGATG/TATA'也不匹配,因为字符串的最后部分(TATG vs 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

最有效的方法是理解,我必须在超过20,000个模式字符串上执行此操作,并且组合超过500万个查询字符串,因此它需要尽可能高效。它不一定是正则表达式解决方案,但它必须支持允许对指定的替换计数(如在{s<=2}中)和错误计数(如在{e<=2}中)进行模糊匹配的选项。

python regex python-3.x fuzzy-search
1个回答
1
投票

您可以使用以下所需的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

这依赖于你总是在模式中只有三个斜线分隔的部分,但是由于任何更通用的内容也需要指定哪些部分是模糊的,哪些部分是非模糊的,我认为这种简单的方法适合你的用例。

任何版本的ideal_function()都必须在每次调用时创建适当的正则表达式,顺便说一句,这可能不是最有效的方法(尽管你必须做一些分析来确定它实际上有多大差异)你的具体情况)。

根据您需要的输出类型,这样的事情可能更有意义:

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匹配的所有查询字符串。

© www.soinside.com 2019 - 2024. All rights reserved.