Skip to main content
 首页 » 编程设计

Python 正则表达式不匹配完整的捕获组

2024年08月28日35langtianya

我正在使用 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')

我确信我以某种方式弄乱了正则表达式,但我终究无法弄清楚如何做。

请您参考如下方法:

看起来你只需要改变第一个捕获组来封装所有三个数字:

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

这匹配:

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

您可能还想将第二个和第三个数字限制为只有两位数,就像您对第一个数字所做的那样:

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