使用regexp进行Python跨文件搜索

时间:2016-08-11 06:35:45

标签: python regex algorithm

我有2个文件,我想从file2(fsearch)获取包含来自file1(forig)的任何给定行的所有行 我写了一个简单的python脚本,如下所示:

def search_string(w, file):
        global matches
        reg = re.compile((r'(^|^.*\|)' + w.strip("\r\n") + r'(\t|\|).*$'), re.M)
        match = reg.findall(file)
        matches.extend(match)

fsearch_text = fsearch.read()
for fword in forig:
        search_string(fword, fsearch_text)

file1中大约有100,000行,file2中大约有200,000行,因此我的脚本大约需要6个小时才能完成。
是否有更好的算法可以在更短的时间内实现相同的目标?

编辑: 我应该举例说明为什么我需要regexp:
我正在搜索file1中的单词列表,并尝试将它们与file2的翻译匹配。如果我不使用正则表达式来限制可能的匹配,我也会匹配仅包含单词I search的单词的翻译,例如:
我搜索的字:浸し
匹配单词:お浸し|御浸し|御したし& n鲣鱼酱油(蔬菜配菜)煮青菜 所以我必须通过^或|来限制匹配的开始,并通过\ t或|来限制匹配的结束,但是捕获整行

1 个答案:

答案 0 :(得分:0)

假设您可以在内存中同时拥有这两个文件。你可以阅读它们并对它们进行排序。

之后,您可以线性比较线条。

f1 = open('e:\\temp\\file1.txt')

lines1 = sorted([line for line in f1])

f2 = open('e:\\temp\\file2.txt')

lines2 = sorted([line for line in f2])

i1 = 0
i2 = 0
matchCount = 0
while (i1 < len(lines1) and i2 < len(lines2)):
    line1 = lines1[i1]
    line2 = lines2[i2]
    if line1 < line2:    
        i1 += 1
    elif line1 > line2:
        i2 += 1
    else:
        matchCount += 1
        i2 += 1

print('matchCount')    
print(matchCount)