首页 > 解决方案 > Python 正则表达式返回不匹配

问题描述

我在 Windows-10 机器上运行 Python 3.8.6。

到目前为止,我一直在运行一个 python 脚本来解析日志文件而没有问题,最近我迁移到了在 Ubuntu 上运行的 rsyslog 服务器。

脚本失败:

fields_data = re_data.match(line)

有错误”

'NoneType' object has no attribute 'group'

存储在变量“行”中的日志字符串:

2020-12-18 13:34:37 - ive - [173.168.115.108] username(CCC Digital Certs)[All_Users] - Agent login succeeded for username/CCC Digital Certs from 173.168.115.108 with Pulse-Secure/9.0.3.1667 (Windows 10) Pulse/9.0.3.1667.#015

正则表达式:

re_data = re.compile(r'(\d{4}.\d{2}.\d{2})\s(\d+.\d+.\d+)\s.+\[(\d+\.\d+\.\d+\.\d+)\]\s(\w+)')

我已经使用下面显示的字符串在线测试了正则表达式,它给了我 4 组日期、时间、IP、名称的正确答案。

代码:

fields_data = re_data.match(line)
out_file.write(f'{fields_data.group(1)},{fields_data.group(2)},{fields_data.group(3)},{fields_data.group(4)},login\n')

标签: pythonregex

解决方案


您显然没有处理匹配的行。请参阅re.match 文档

回覆。match (pattern, string, flags=0)
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。None如果字符串与模式不匹配则返回;请注意,这与零长度匹配不同。(强调我的)

通过检查避免此错误:

fields_data = re_data.match(line)
if fields_data and len(fields_data.groups()) > 4: # 0 + 4 groups == 5 minimum
    out_file.write(f'{fields_data.group(1)},{fields_data.group(2)},'
                   f'{fields_data.group(3)},{fields_data.group(4)},login\n')
else:
    print(f"Not a match: '{line}'")

或错误处理(建议在此处使用检查):

fields_data = re_data.match(line)
try:
    out_file.write(f'{fields_data.group(1)},{fields_data.group(2)},'
                   f'{fields_data.group(3)},{fields_data.group(4)},login\n')
except AttributeError: 
     pass

如果您在文件之间或文件末尾提供“空”行,通常会发生这种错误。可能想检查一下:

if not line.strip(): continue  # skip empty lines

推荐阅读