Python正则表达式与完全捕获组不匹配

时间:2014-01-30 00:32:56

标签: python regex

我正在使用Python脚本将一些IRC日志(energymech格式)添加到数据库中;要做到这一点,我必须将字符串分成他们的部分(时间戳,用户,消息)。

我正在使用以下正则表达式来获取适合的文本行:

normalline = re.compile('^\[[^\]]*(\d{2}):\d+:\d+\] <([^>]+)> (.*)$')

问题是它没有正确分配第一个捕获组(它只返回组中的前2个字符)。

我正在测试它的文本行[20:33:02] <user> random message here

我用来测试的脚本如下:

import re
normalline = re.compile('^\[[^\]]*(\d{2}):\d+:\d+\] <([^>]+)> (.*)$')
print normalline.search('[20:33:02] <user> random message here').groups()

我得到的结果是('20', 'user', 'random message here')而不是('20:33:02', 'user', 'random message here')

我确信我会以某种方式弄乱正则表达式,但对于我的生活,我无法弄清楚如何。

1 个答案:

答案 0 :(得分:3)

您似乎只需要更改第一个捕获组来封装所有三个数字:

^\[[^\]]*(\d{2}:\d+:\d+)\] <([^>]+)> (.*)$

匹配:

('20:33:02', 'user', 'random message here')

您可能还希望将第二个和第三个数字限制为仅两位数,就像您对第一个数字一样:

^\[[^\]]*(\d{2}:\d{2}:\d{2})\] <([^>]+)> (.*)$