【问题标题】:Python - Regex on large log filePython - 大型日志文件上的正则表达式
【发布时间】:2015-05-28 14:08:34
【问题描述】:

我有一个约 3000 行长的日志文件,我需要找到某个字符串的第一次出现。哪种方式是最好/最有效的方式?

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)

或者有没有更好的方法我没有想到?

【问题讨论】:

  • “大”有多大?
  • 好吧,如果您只需要第一次出现 - 逐个字符串读取并在找到子字符串后中断最有可能为您节省一些时间。
  • 该行是否以字符串开头(如您的 re 所示),字符串是硬编码还是模式?一般来说,如果它是一个固定的字符串,那么使用字符串方法是要走的路,而不是re
  • @Lutz Horn 它的长度约为 3000 行
  • @Ripread 这是一个小文件。

标签: python regex parsing


【解决方案1】:

在这种情况下,作为一种更 Python 的方式,您可以使用 str.startswith

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

但是关于使用re.search vs re.match,如果你想从头开始匹配字符串,使用为此目的而设计的re.match更有效。

【讨论】:

    【解决方案2】:

    我喜欢你的第二个,但性能明智,因为你的正则表达式非常简单,你可以使用startswith方法

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

    【讨论】:

      【解决方案3】:

      您实际上可以通过 Python 的 datetime 库这样简单的工具检查算法使用的大致时间,例如:

      import datetime
      
      start = datetime.datetime.now()
      # insert your code here #
      end = datetime.datetime.now()
      
      result = end - start
      print(result)
      

      问题是,python 算法查找短语的 3000 行时间消耗在这两种方法中都很低。但是,根据我的测试,如果文本位于文本末尾附近,则第一种方法会更快一些。我测试了一个 454kb 的文本文件,它有 3000 多行,大多数行是整个段落。 (下图)的数字约为 0.09 秒。不过不得不提的是,如果没有 ^ 正则表达式来匹配字符串的开头,完成任务所需的时间仅为 0.04s。

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

      相对于 0.12 秒

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

      【讨论】:

        猜你喜欢
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多