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

使用正则表达式(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:31:06