【问题标题】:How to improve a python regex data file parsing efficiency?如何提高 python 正则表达式数据文件的解析效率?
【发布时间】:2013-10-28 22:24:58
【问题描述】:

我有这样的数据文件:

group Head:
  data1:        abc         data2:            def
  2word data3:  ghi         data4:            jkl
  data3:        mno         three word data4: pqr stu

所以在 python 中我构建了一个这样的正则表达式:

Data = re.findall(r'(([\w\(\)]+[ \t\f]?)+):([ \t\f]*(\S+))', data)

我的文件接近 600 行,通常有 2 列,如上所示,每个文件解析它们需要几分钟时间。

使这段代码更高效的最佳方法是什么,以便每个文件在不到 10 秒的时间内运行?

【问题讨论】:

  • 你想从这些文件中提取什么?
  • 你能提供描述这种格式的语法吗?
  • @Floris 是键和值,但上面列出的格式的整个文件只是重要部分。例如,我想要键 'data1' 和值 'abc'
  • 键是“在该行的第一个冒号之前没有空格的字符串”吗?值是“之后的第一个词”吗?换句话说 - 你想要第 2 行、第 3 行的输出是什么?它必须是 Python 正则表达式吗?
  • @Lucho 这些文件只是纯文本文件,从网络设备输出。这是从轮询器中提取的数据

标签: python regex performance


【解决方案1】:
import re

data = """group Head:
  data1: abc         data2: def
  2word data3: ghi   data4: jkl
  data3: mno         three word data4: pqr stu"""

for l in data.split('\n'):
    print [ x.split(':') for x in re.split('\s\s+', l) if x ] 

给予:

[['group Head', '']]
[['data1', ' abc'], ['data2', ' def']]
[['2word data3', ' ghi'], ['data4', ' jkl']]
[['data3', ' mno'], ['three word data4', ' pqr stu']]

【讨论】:

  • 我敢打赌这会明显更快,因为它一次处理一行,而不是整个文件。
  • @perreal 谢谢!现在每个文件的执行时间不到 2 秒!非常感谢!
【解决方案2】:

您正在嵌套重复运算符,可能会得到exponential backtracking

试试这个:

r'(\S.+)\s*:\s*(\S+)'

非空格后跟其他任何内容,冒号周围有可选的空格,还有一些非空格。

【讨论】:

  • +1 我认为您对指数回溯的看法是正确的,谢谢您的提示!
【解决方案3】:

这可能需要更短的时间

 # ([\w()](?:[^\S\r\n]?[\w()]+)*)[^\S\r\n]*:[^\S\r\n]*([\w()](?:[^\S\r\n]?[\w()]+)*)

 (                                 # (1) Key
      [\w()] 
      (?: [^\S\r\n]? [\w()]+ )*
 )
 [^\S\r\n]* : [^\S\r\n]* 
 (                                 # (2) Value
      [\w()] 
      (?: [^\S\r\n]? [\w()]+ )*
 )

【讨论】:

    【解决方案4】:

    预编译您的正则表达式。 Docs.

    如果可能,拆分文件并逐行解析。

    两者都应该有助于减少您的时间。

    【讨论】:

    • re 模块已经缓存了最近的正则表达式;这不应该节省 分钟 除非有数百个正则表达式浮动
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多