【发布时间】:2012-09-13 21:44:46
【问题描述】:
我在 python 中有一个脚本来处理日志文件 - 它解析值并简单地用 tab 连接它们。
p = re.compile(
"([0-9/]+) ([0-9]+):([0-9]+):([0-9]+) I.*"+
"worker\\(([0-9]+)\\)(?:@([^]]*))?.*\\[([0-9]+)\\] "+
"=RES= PS:([0-9]+) DW:([0-9]+) RT:([0-9]+) PRT:([0-9]+) IP:([^ ]*) "+
"JOB:([^!]+)!([0-9]+) CS:([\\.0-9]+) CONV:([^ ]*) URL:[^ ]+ KEY:([^/]+)([^ ]*)"
)
for line in sys.stdin:
line = line.strip()
if len(line) == 0: continue
result = p.match(line)
if result != None:
print "\t".join([x if x is not None else "." for x in result.groups()])
但是,脚本的运行速度很慢,处理数据需要很长时间。
如何以更快的方式实现相同的行为? Perl/SED/PHP/Bash/...?
谢谢
【问题讨论】:
-
定义“慢慢地”。你确定它是正则表达式吗?文件系统、网络,还有其他什么是整体的一部分?每个时间单位处理多少行?我并不是说这不是您的(复杂)正则表达式,但您可能想确保这是您的问题。
-
另外,对于括号内的 python 字符串,
+连接是多余的。 Python 会自动连接这些字符串。 -
if len(line) == 0:可以缩短为if len(line):可以缩短为if line:不能再缩短了。 -
.*事情可能会导致很多回溯,尝试摆脱它们(替换为[^...])。您还可以发布您输入的示例吗? -
grep/awk 是正则表达式的速度参考:stackoverflow.com/a/11192394/718618
标签: python regex perl bash sed