我有一个 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 的查询字符串。
