我有这样的数据文件:
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秒的时间内运行?
答案 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)