如何提高python正则表达式数据文件的解析效率?

时间:2013-10-28 22:24:58

标签: python regex performance

我有这样的数据文件:

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秒的时间内运行?

4 个答案:

答案 0 :(得分:2)

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

请改为尝试:

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

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

答案 1 :(得分:2)

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']]

答案 2 :(得分:1)

这可能需要更短的时间

 # ([\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()]+ )*
 )

答案 3 :(得分:0)

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

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

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