2015-05-28 75 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可能不是最好的选择),否则这两种方法都需要很少的时间。