正则Look Ahead/Look Behind适配不同后瞻模式的问题求助
解决Trend Micro CEF日志中适配多格式的源IP/域名提取问题
核心正则方案
针对CEF日志中dst字段后内容不固定的问题,设计以下正则表达式,可同时匹配IPv4地址和合法域名,且不依赖后续固定字段:
dst=((?:\d{1,3}\.){3}\d{1,3}|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})(?:\s+\w+=|$)
正则逻辑拆解
dst=:精准定位目标字段的起始标识- 捕获组(提取核心内容):
(?:\d{1,3}\.){3}\d{1,3}:匹配标准IPv4地址格式(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}:匹配合法域名,支持带连字符的子域名及多后缀顶级域名
(?:\s+\w+=|$):匹配后续CEF字段(空格+字段名=)或日志结尾,作为终止边界,避免匹配多余内容
代码实现(避免AttributeError)
在调用捕获组前必须先判断匹配结果是否存在,彻底解决NoneType报错问题,以Python为例:
import re # 示例CEF日志(完整/不完整格式均兼容) cef_log1 = "CEF:0|Trend Micro|OfficeScan|11.0|530|Malware detected|High|src=10.0.0.5 dst=192.168.1.20 cs5=MD5:abc123 ..." cef_log2 = "CEF:0|Trend Micro|OfficeScan|11.0|530|Malware detected|High|src=10.0.0.5 dst=malware-abc.example.org" pattern = r'dst=((?:\d{1,3}\.){3}\d{1,3}|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})(?:\s+\w+=|$)' # 处理日志1 match1 = re.search(pattern, cef_log1) if match1: print(f"日志1提取结果:{match1.group(1)}") else: print("日志1未匹配到有效源IP/域名") # 处理日志2 match2 = re.search(pattern, cef_log2) if match2: print(f"日志2提取结果:{match2.group(1)}") else: print("日志2未匹配到有效源IP/域名")
补充说明
- 若需要严格校验IPv4地址的合法性(比如排除256以上的数值),可将IP部分正则替换为:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) - 域名部分已覆盖绝大多数合法场景,若需适配特殊域名格式(如带下划线),可在字符集内添加
_ - 该方案完全不依赖
dst字段后的固定字段,无论日志是否完整都能稳定匹配
内容的提问来源于stack exchange,提问作者OverflowStack
相关产品推荐
相关产品推荐

