首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regexp进行Python跨文件搜索

使用regexp进行Python跨文件搜索
EN

Stack Overflow用户
提问于 2016-08-11 14:35:45
回答 2查看 54关注 0票数 1

我有两个文件,我想从file2(fsearch)中获取包含file1(forig)中任何给定行的所有行。

我编写了一个简单的python脚本,如下所示:

代码语言:javascript
复制
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或|,但要捕获整个行

EN

回答 2

Stack Overflow用户

发布于 2016-08-11 15:16:57

假设您可以将这两个文件都存储在内存中。您可以阅读它们并对它们进行排序。

在此之后,您可以线性比较这些行。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2016-08-11 17:02:24

如果可以使用UNIX/GNU/Linux命令,您可以这样做:

代码语言:javascript
复制
# 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.txt

grep针对这类操作进行了优化,因此上面的调用所需时间不到一秒(看看this)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38888925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档