2015-05-28 65 views
1

我有一個~3000行的長日誌文件,我需要找到某個字符串的第一個匹配項。哪種方式是最好的/最有效的方式去做呢?Python - 大日誌文件上的正則表達式

with open(filename, 'r') as f: 
    match = re.search(r'^EXHAUST.*', f.read(), re.MULTILINE) 

with open(filename, 'r') as f: 
    for line in f: 
     match = re.match(r'EXHAUST.*', line) 

或是否有更好的辦法,我沒有想到的?

+0

「大」有多大? –

+0

那麼,如果你只需要第一次發生 - 在字符串中讀取字符串並在找到你的子字符串後中斷會最有可能節省你一些時間。 – konart

+0

該行是否以字符串開頭(如您的re指示),並且是硬編碼的字符串還是模式?一般來說,如果它是一個固定的字符串,那麼使用字符串方法是最好的選擇,而不是're'。 – cdarke

回答

3

在這種情況下,更Python的方式,你可以使用str.startswith:如果你想從開始使用re.match已經爲其設計了更高效的匹配字符串

with open(filename, 'r') as f: 
    for line in f: 
     if line.startswith('EXHAUST') : 
      #do stuff 

但是關於使用re.search VS re.match這個目標。

1

我喜歡你的第二個,但在性能方面,因爲你的正則表達式是非常簡單的,你可以使用startswith方法

with open(filename, 'r') as f: 
    for line in f: 
     match = line.startswith('EXHAUST') 
0

你幾乎可以檢查通過簡單的東西如Python的日期時間庫使用的算法大概時間,例如:

import datetime 

start = datetime.datetime.now() 
# insert your code here # 
end = datetime.datetime.now() 

result = end - start 
print(result) 

的事情是,與蟒蛇算法3000行時間消耗找到這句話是低配兩種方法。但是,從我的測試中,如果文本位於靠近文本末尾,則第一種方法會快一點。我測試了一個超過3000行的454kb文本文件,大部分行都是整段。 (下)的數字約爲0.09s。但是,我必須提及,如果沒有用於匹配字符串開頭的^ regex符號,完成任務的時間僅爲0.04s。

with open(filename, 'r') as f: 
    match = re.search(phrase, f.read()) 

與0.12S爲

with open(filename, 'r') as f: 
    i = 0 
    for line in f: 
     i += 1 
     match = re.match(phrase, line) 
      if match: 
      break; 

這裏需要休息,否則匹配的對象將是最後一次出現發現我用來找出其中線,我們發現了比賽。因爲.start和.end方法的位置,否則將相對於我們所在的行。但是,在搜索方法中,默認情況下,您可以通過.start和.end匹配對象方法獲取匹配位置。

然而在我的測試案例中,第一次出現接近.txt文件的末尾,所以如果接近開始第二個方法將佔上風,因爲它將停止在該行搜索,而第一個方法的時間消耗保持不變。

除非你正在做這個競爭性編碼(無論如何Python可能不是最好的選擇),否則這兩種方法都需要很少的時間。