我有一个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}
中)进行模糊匹配的选项。
您可以使用以下所需的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
匹配的所有查询字符串。