如何加速Python中的模糊正则表达式搜索
优化模糊正则表达式搜索效率的建议请求
需求说明
在存储于testFile文件(每行一个约150字符的字符串)的字符串集合中,对字典d中存储的关键词进行模糊搜索(最多允许4个错配)。字典d的每个值均为包含两个元素的列表,需记录匹配到的是哪个元素。示例字典如下:
d = {"kw1": ["AGCTCGATGTATGGGTATATGATCTTGAC", "GTCAAGATCATATACCCATACATCGAGCT"], "kw2": ["GGTCAGGTCAGTACGGTACGATCGATTTCGA", "TCGAAATCGATCGTACCGTACTGACCTGACC"]} #简化为仅两个关键词
当前实现方式
先将正则表达式编译后存入字典compd,再逐行读取文件,在每行字符串中搜索每个关键词。若某关键词的第一个列表元素匹配成功,则跳过该关键词的第二个元素,但需继续搜索其他关键词。当前实现代码如下:
#!/usr/bin/env python3 import argparse import regex parser = argparse.ArgumentParser() parser.add_argument('file', help='file with strings') args = parser.parse_args() #dictionary with keywords d = {"kw1": ["AGCTCGATGTATGGGTATATGATCTTGAC", "GTCAAGATCATATACCCATACATCGAGCT"],"kw2": ["GGTCAGGTCAGTACGGTACGATCGATTTCGA", "TCGAAATCGATCGTACCGTACTGACCTGACC"]} #Compile regex (4 mismatches max) compd = {"kw1": [], "kw2": []} #to store regex for k, v in d.items(): #for each keyword compd[k].append(regex.compile(r'(?b)(' + v[0] + '){s<=4}')) #compile 1st elt of list compd[k].append(regex.compile(r'(?b)(' + v[1] + '){s<=4}')) #compile second #Search keywords with open(args.file) as f: #open file with strings line = f.readline() #first line/string while line: #go through each line for k, v in compd.items(): #for each keyword (ID, regex) for val in [v[0], v[1]]: #for each elt of list found = val.search(line) #regex search if found != None: #if match print("Keyword " + k + " found as " + found[0]) #print match if val == v[0]: #if 1st elt of list break #don't search 2nd line = f.readline() #next line
测试testFile文件内容如下:
AGCTCGATGTATGGGTATATGATCTTGACAGAGAGA GTCGTAGCTCGTATTCGATGGCTATTCGCTATATGCTAGCTAT
得到预期结果:
Keyword kw1 found as AGCTCGATGTATGGGTATATGATCTTGAC
效率问题
当前脚本处理500k条字符串和6个关键词需3-4分钟,若处理200万条字符串预计耗时12-16分钟,希望能优化提速。
内容的提问来源于stack exchange,提问作者Agathe
相关产品推荐
相关产品推荐

