如何计算python中两个文件之间的匹配?

时间:2016-06-02 20:47:14

标签: python

我是使用python的新手,问题是我不知道在哪里可以开始解决以下问题

我有3个文件

1个文件包含类似的内容:

pm_rpm@fences
pm_rpm@fences-dpms
pm_rpm@modeset-lpsp-stress
pm_rpm@modeset-non-lpsp-stress
pm_rpm@modeset-lpsp-stress-no-wait
pm_rpm@modeset-non-lpsp-stress-no-wait
pm_rpm@modeset-pc8-residency-stress
pm_rpm@modeset-stress-extra-wait
pm_rpm@system-suspend
pm_rpm@system-suspend-execbuf
pm_rpm@system-suspend-modeset

这1个文件包含我将运行的所有测试

第二个文件如下所示:

kms_vblank@accuracy
kms_vblank@query-idle
kms_vblank@query-busy
kms_vblank

第三个文件如下所示:

kms_flip@2x-rcs-wf_vblank-vs-modeset
kms_flip@basic-plain-flip
kms_flip@2x-plain-flip
kms_flip@busy-flip
kms_flip@2x-busy-flip

所以基本上我需要检查文件2和文件3中有多少测试在文件1中,并得到像这样的输出

file 2 : 3 tests found
file 3 : 10 tests found

但是例如,如果在文件2或文件3中的任何一个中,我使用这样的通配符进行测试:

gem_concurrent *

我需要python脚本也可以使用通配符

非常感谢你对此的帮助

2 个答案:

答案 0 :(得分:2)

我用python 3编写了这些程序,第一个包含'@'符号后面的测试,第二个包含整个测试名称:

file1=open("file1.txt")
file2=open("file2.txt")
file3=open("file3.txt")
f1=file1.read().split("\n")
f2=file2.read().split("\n")
f3=file3.read().split("\n")
file1.close()
file2.close()
file3.close()

f1s,f2s,f3s=[],[],[]        #file1 split, file2 split, file3 split
try: [f1s.append(i.split("@")[1]) for i in f1]
except IndexError: pass

try: [f2s.append(i.split("@")[1]) for i in f2]
except IndexError: pass

try: [f3s.append(i.split("@")[1]) for i in f3]
except IndexError: pass

match2=0
for i in f2s:
    if i[-1:]=="*":
        i=i[:-1]
        if [e for e in f1s if e[:len(i)]==i]: match2+=1
    elif i in f1s: match2+=1

match3=0
for i in f3s:
    if i[-1:]=="*":
        i=i[:-1]
        if [e for e in f1s if e[:len(i)]==i]: match3+=1
    elif i in f1s: match3+=1

print("file 2:", match2, "tests found")
print("file 3:", match3, "tests found")

第二个程序:

f1=open("file1.txt")
f2=open("file2.txt")
f3=open("file3.txt")
f1s=f1.read().split("\n")
f2s=f2.read().split("\n")
f3s=f3.read().split("\n")
f1.close()
f2.close()
f3.close()

match2=0
for i in f2s:
    if i[-1:]=="*":
        i=i[:-1]
        if [e for e in f1s if e[:len(i)]==i]: match2+=1
    elif i in f1s:
        match2+=1
match3=0
for i in f3s:
    if i[-1:]=="*":
        i=i[:-1]
        if [e for e in f1s if e[:len(i)]==i]: match3+=1
    elif i in f1s:
        match3+=1
print("file 2:", match2)
print("file 3:", match3)

通过我所做的测试,他们似乎都工作并支持通配符,但如果两者都存在问题,请发表评论。

希望这有帮助。

答案 1 :(得分:0)

使用python2.7这是一个非常愚蠢的解决方案:

import re

def findCommon(a,b):
    allmatches=[]
    for test in b:
        if "*" in test or "?" in test:
            reg=re.compile(test)
            matches=[line for line in a for m in [reg.search(line)] if m]
        else:
            matches=[line for line in a if test==line]
        allmatches.extend(matches)
    c=set(allmatches)
    return len(c)

def main():
    content1=[]
    content2=[]
    content3=[]
    with open('file1.txt','r') as f1:
        content1=[line.strip() for line in f1]
    with open('file2.txt','r') as f2:
        content2=[line.strip() for line in f2]
    with open('file3.txt','r') as f3:
        content3=[line.strip() for line in f3]

    print "file 2 :", findCommon(content1,content2),"tests found"
    print "file 3 :", findCommon(content1,content3),"tests found"

main()

它首先将整个文件读入三个列表,然后在两对上调用findCommon函数。

findCommon函数迭代第二个列表(文件)并检查测试名是否包含通配符(当然这假设只有两个通配符;?和*,这可能是错误的)。如果是,它在第​​一个文件上使用正则表达式匹配,否则使用简单相等来查找匹配。 set用于删除重复的匹配。