2015-09-03 37 views
1

我想要統計文件中每行的多個模式的出現次數。所以如果從行中找到任何模式,我希望將計數器增加1,所以最終可以得出包含我定義的模式的行總數。但是我堅持要在一行中搜索多個模式,但是如果發現任何模式則增加1。 任何人都可以提供這方面的建議嗎? 並且我可以製作涵蓋我定義的三種模式的單一模式嗎?從python中的行計算模式的出現次數

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() 

回答

1

只要pattern.search(線)是成功的,你應該增加一個計數,並立即break從內循環。

因此,沿着線的東西:

if pattern.search(lines) 
count += 1 
break 

應該做的工作。

編輯:

關於其他問題,因爲模式是非常相似的,你可以使用pipe operator包括它們各成一體。我覺得會工作,但自己試一試:

HELLO\(L[0-9]\)\:\([Unknown\]|[Known\]\)?[APP*?\] 

如果這個(或這方面的一個變體)的作品,你可以完全消除內環:)

還有一個偉大的圖形工具來幫助您處理名爲Debuggex的半複雜正則表達式以及在Regex101上在線測試您的表達式的工具。

+1

模式是一個字符串,它將如何進行搜索? –

0

您可以使用any與你原來的代碼,這將短路上的任何比賽,你還需要實際使用reif 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 
+0

這就是我正在尋找..感謝讓我知道使用「任何」。我正在尋找一種方法在一次試驗中查找單行的所有模式,因此,只要找到一個匹配的模式,我就不會增加計數器。 –

+0

你想匹配計數的所有模式增加或任何? –

1

首先你不能使用pattern.search(line)pattern是一個字符串,並且沒有search方法。
您需要使用re.searchre.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 answerdocs