我有一个解析日志文件的脚本,在编程的一部分我必须知道是否传输了一条消息,通过读取这些行,我可以得到消息ID并知道消息是否被传输。
01:09:25.258 mta Messages I Doc O:NVS:SMTP/alarm@yyy.xx R:NVS:SMS/+654811 mid:6261
01:09:41.965 mta Messages I Rep 6261 OK, Message received(ID: 26)
08:14:14.469 mta Messages I Doc O:NVS:SMTP/alarm@xxxx.en R:NVS:SMS/+654646 mid:6262
08:14:30.630 mta Messages I Rep O:NVS:SMTP/alarm@azea.er R:NVS:SMS/+304859 mid:6262
08:14:30.630 mta Messages I Rep 6262 Error while transmitting (ID: 28)
我感兴趣的线是第二个和最后一个,我想提取6261和之后的确定和最后一行相同
答案 0 :(得分:5)
你不需要正则表达式。只需在空格上分割线条。
>>> line.split(None, 5)
['10:56:45.255', 'Message', 'I', 'Rep', '2559', 'OK, Message received']
由于您只需要ID和消息:
>>> [line.split(None, 5)[-2:] for line in file.readlines()]
[['2548', 'OK'], ['2559', 'OK, Message received'], ['2560', 'Error'], ['2561', 'Transmission... ']]
请注意,邮件中的空格不是问题。
答案 1 :(得分:-1)
/[0-9]{4} (.*)/
符合目的,但我不知道这对你来说是否足够通用。根据行ID(2548等)是否也可以更短,正则表达式必须稍微调整,但从显示的4行中可以使用。
在编写正则表达式时,最重要的是不要单独使用“样本”,而是根据您尝试匹配的字符串的“可用假设”进行操作。我无法可靠地说这个解决方案完全解决了你的问题,因为我不知道整个问题,因此无法提供完美的模式。