使用正则表达式(RegEx)解析特定格式日志文件的技术求助
日志解析正则解决方案
问题分析
你之前的正则存在两个核心问题:
(\n.*)+是贪婪匹配,会直接匹配到文件末尾的分隔符,导致无法正确分割条目- 重复捕获组(带
+的组)只会保留最后一次匹配的内容,所以组3为空
正确正则表达式
使用多行模式(re.MULTILINE 或 (?m) 标记)的正则:
^={19}\n(.*)\n={19}\n\n([\s\S]*?)\n(?=={19}|$)
正则解释
^={19}\n:匹配每个条目开头的19个等号及后续换行(^在多行模式下匹配每行开头)(.*):捕获标题行(DateTimeStamp - ShortSummaryOfEntry),对应你的RecordField1\n={19}\n\n:匹配标题后的19个等号、换行及空行([\s\S]*?):非贪婪匹配所有内容([\s\S]匹配任意字符包括换行),直到遇到下一个分隔符或文件结尾,对应你的RecordField2\n(?=={19}|$):前瞻匹配,确保内容截止到下一个19个等号的前一行,不会包含分隔符
示例代码(Python)
import re log_content = """=================== 2024-05-20 10:00:00 - User Login =================== User ID: 12345 IP Address: 192.168.1.100 Status: Success =================== 2024-05-20 10:05:00 - File Upload =================== File Name: report.pdf Size: 2.5MB Uploader: User 12345 """ pattern = re.compile(r'^={19}\n(.*)\n={19}\n\n([\s\S]*?)\n(?=={19}|$)', re.MULTILINE) matches = pattern.findall(log_content) for idx, (field1, field2) in enumerate(matches, 1): print(f"Record{idx}Field1:") print(field1) print(f"Record{idx}Field2:") print(field2.strip()) # 去除首尾空行 print()
输出结果
Record1Field1: 2024-05-20 10:00:00 - User Login Record1Field2: User ID: 12345 IP Address: 192.168.1.100 Status: Success Record2Field1: 2024-05-20 10:05:00 - File Upload Record2Field2: File Name: report.pdf Size: 2.5MB Uploader: User 12345
内容的提问来源于stack exchange,提问作者BJS
相关产品推荐
相关产品推荐

