我是使用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脚本也可以使用通配符
非常感谢你对此的帮助
答案 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
用于删除重复的匹配。