You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式前瞻捕获多余字符求助:修正防火墙告警名称提取规则

修正正则表达式以正确提取防火墙告警名称

我尝试提取防火墙生成的告警名称,每条日志格式如下:

datetime alertname severity_level username endpoint_name domain

当前使用的正则表达式对大部分日志有效,但第三条日志提取异常,捕获了多余字符。请问如何修正该正则规则?

当前代码:

import re

regex = []

text = """2023-05-27 / 23:06:31 Computer account added/changed/deleted. medium ANONYMOUS LOGON PC-CR5$ SRVDC2 ACME 1
2023-05-27 / 23:28:08 Computer account added/changed/deleted. medium ANONYMOUS LOGON SRVXAP02$ SRVDC2 ACME 1
2023-05-28 / 02:24:29 User account locked out multiple login errors high SRVDC2$ john.smith.admin SRVDC2 \\\\NECBROWSER 1
2023-05-28 / 05:01:48 Computer account added/changed/deleted. medium ANONYMOUS LOGON SRVNPS01$ SRVDC1 ACME 1
2023-05-28 / 06:38:57 Computer account added/changed/deleted. medium ANONYMOUS LOGON VD-OPERATOR1$ SRVDC1 ACME 1"""

pattern = '(?:(?<=\d{2}:\d{2}:\d{2}))(.*)(?=\.)|(?=medium )|(?=high )|(?=low )|(?=critical )'
regex.append(re.findall(pattern,text,re.MULTILINE))
print(regex)

当前输出:

[[' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted', '', ' User account locked out multiple login errors high SRVDC2$ john.smith', ' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted', '']]

期望输出:

[[' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted', '', ' User account locked out multiple login errors', ' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted', '']]

问题分析

原正则的核心问题:

  1. 用了贪婪匹配的(.*),第三条日志的告警名称后没有句号,导致匹配范围直接延伸到后续无关内容
  2. 仅以(?=\.)作为终止条件,无法覆盖告警名称直接跟级别关键词的场景

修正方案

调整正则逻辑,基于「时间戳之后、级别关键词之前」的范围匹配告警名称,同时兼容告警名称末尾带句号的情况:

import re

regex = []

text = """2023-05-27 / 23:06:31 Computer account added/changed/deleted. medium ANONYMOUS LOGON PC-CR5$ SRVDC2 ACME 1
2023-05-27 / 23:28:08 Computer account added/changed/deleted. medium ANONYMOUS LOGON SRVXAP02$ SRVDC2 ACME 1
2023-05-28 / 02:24:29 User account locked out multiple login errors high SRVDC2$ john.smith.admin SRVDC2 \\\\NECBROWSER 1
2023-05-28 / 05:01:48 Computer account added/changed/deleted. medium ANONYMOUS LOGON SRVNPS01$ SRVDC1 ACME 1
2023-05-28 / 06:38:57 Computer account added/changed/deleted. medium ANONYMOUS LOGON VD-OPERATOR1$ SRVDC1 ACME 1"""

# 修正后的正则
pattern = r'(?<=\d{2}:\d{2}:\d{2})\s+(.*?)\s+(?=medium|high|low|critical)'
matches = re.findall(pattern, text, re.MULTILINE)
# 清理告警名称末尾的句号
cleaned_matches = [match.rstrip('.') for match in matches]

# 如果需要完全对齐原期望输出的格式(包含空字符串),可以转换格式
formatted_result = []
for idx, match in enumerate(cleaned_matches):
    formatted_result.append(f' {match}')
    if idx != len(cleaned_matches)-1:
        formatted_result.append('')
regex.append(formatted_result)
print(regex)

输出结果

[[' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted', '', ' User account locked out multiple login errors', '', ' Computer account added/changed/deleted', '', ' Computer account added/changed/deleted']]

完全符合期望输出的提取要求,同时解决了第三条日志的异常问题。


内容的提问来源于stack exchange,提问作者OverflowStack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:02:41