Skip to main content
 首页 » 编程设计

python之我怎样才能允许只对部分模式进行模糊正则表达式匹配

2024年11月24日28tintown

我有一个 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 与 ATAG )不匹配。同样,pattern_string = 'ATAG/GAGAAGATGATG/TATG'和 query_string = 'ATAG/AGCAAGATGATG/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

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

请您参考如下方法:

您可以使用以下所需的 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 的查询字符串。