我想计算文件中每行的多个模式的出现次数。因此,如果从行中找到任何模式,我想将计数器增加1,所以最后,我可以得出包含我定义的模式的总行数。但是我坚持在一行中搜索多个模式,但如果找到任何模式,则将计数增加1。 任何人都可以就此提出建议吗? 我可以制作涵盖我定义的三种模式的单一模式吗?
def sample_output(input_file):
lines_detect_pattern = 0
lines_not_detect_pattern = 0
patterns =['HELLO\(L[0-9]\)\:\[APP*?\]',
'HELLO\(L[0-9]\)\:\[Unknown\]\[APP.*?\]',
'HELLO\(L[0-9]\)\:\[Known\]\[APP.*?\]',
]
myfile = open(input_file, 'r')
outfile = open(final_file,'a+')
for line in myfile:
for pattern in patterns:
if pattern.search(line)
outfile.write("Total number of system passed PMEM : %s \n" %pmem_pass)
outfile.write("Total number of system failed PMEM : %s \n" %pmem_fail)
outfile.close()
myfile.close()
答案 0 :(得分:1)
一旦pattern.search(line)成功,你应该增加一个计数并立即从内循环中break
。
所以,有些东西:
if pattern.search(lines)
count += 1
break
应该做的工作。
编辑:
关于另一个问题,由于模式非常相似,您可以使用pipe operator将它们全部合并为一个。我认为这会有效但是亲自尝试一下:
HELLO\(L[0-9]\)\:\([Unknown\]|[Known\]\)?[APP*?\]
如果这个(或其变体)有效,你可以完全删除内循环:)
还有一个很棒的图形工具可以帮助您处理名为Debuggex的半复杂正则表达式,以及一个在Regex101上在线测试您的表达式的工具。
答案 1 :(得分:1)
首先,您无法使用pattern.search(line)
。 pattern
是一个字符串,没有search
方法
您需要在已编译的正则表达式上使用re.search
或re.compile
(然后使用search
方法)。它对您的代码没有任何影响。正如文档所说:
注意:传递给
re.match()
,re.search()
或re.compile()
的最新模式的已编译版本已缓存,因此仅使用少数常规模式的程序一次表达式不必担心编译正则表达式。
像这样:
import re
pattern = 'HELLO\(L[0-9]\)\:(?:\[(?:Unk|K)nown\])?\[APP.*?\]'
...
for line in myfile:
if re.search(pattern, line):
lines_detect_pattern = lines_detect_pattern + 1
else:
lines_not_detect_pattern = lines_not_detect_pattern + 1
对于打开文件,您可以使用with
语句。阅读in this answer或docs。
答案 2 :(得分:0)
您可以将any
与原始代码一起使用,这会在任何匹配项上发生短路,您还需要实际使用re
,if re.search(pattern,line)
:
sm = sum(1 for line in myfile if any(re.search(pattern, line) for pattern in patterns))
你可以先编译模式:
r = re.compile("|".join(patterns))
sm = sum(1 for line in myfile if r.search(line))
一个简单的例子:
patterns = ["\d+", "foo"]
import re
r = re.compile("|".join(patterns))
myfile = ["23", "foob", "bar", "hello world"]
sm = sum(1 for line in myfile if r.search(line))
print(sm)
输出:
2