我有两个文件,我想从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中的翻译进行匹配。如果我不使用regexp来限制可能的匹配,我还会匹配仅包含我搜索的单词作为其自身一部分的单词的翻译,例如:
我搜索的单词:浸し
配对词:お浸し|御浸し|御したし&n波尼托酱油煮青菜(蔬菜配菜)
因此,我必须将匹配的开始限制为^或|,将匹配的结束限制为\t或|,但要捕获整个行
发布于 2016-08-11 15:16:57
假设您可以将这两个文件都存储在内存中。您可以阅读它们并对它们进行排序。
在此之后,您可以线性比较这些行。
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)发布于 2016-08-11 17:02:24
如果可以使用UNIX/GNU/Linux命令,您可以这样做:
# fill example files
for i in {1..100000}; do echo $RANDOM; done > file1.txt
for i in {1..200000}; do echo $RANDOM; done > file2.txt
# get every line of file2.txt which is also in file1.txt
# for static string matching:
grep -F -x -f file1.txt file2.txt
# for regex matching use (regular expressions in file1.txt):
grep -f file1.txt file2.txtgrep针对这类操作进行了优化,因此上面的调用所需时间不到一秒(看看this)。
https://stackoverflow.com/questions/38888925
复制相似问题