python - 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')
解决方案
您显然没有处理匹配的行。请参阅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
推荐阅读
- django - 如何将 Celery 配置为使用 Gunicorn 提供的 Django 应用程序作为 systemd 服务运行?
- ios - 在模拟器中推送通知 - 不工作 Xcode 11.4beta
- symfony - 在 Symfony 中向返回的实体添加数据
- firebase - Android NDK Firebase crashlytics SDK CrashlyticsOrgIdException :无法获取 Crashlytics 组织 ID
- javascript - 从Vue js中的动态类名获取元素
- python - 用python从字符串中删除不需要的引号
- r - 两个连续剖面的交点
- cygwin - 外部库、MPI、Hdf5 错误
- javascript - RxJS 如何创建或模拟异步?
- android - 如何禁用 SSL 验证?