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

正则日志解析:如何从首个Round_Start事件开始到Game_Over事件停止解析

实现方案

提供两种改造方案,可根据你的使用场景选择:

方案1:逐行遍历+状态控制(推荐)

通过状态标记控制解析区间,逐行处理日志,内存占用低、扩展性强,后续新增事件只需增加对应匹配分支即可。

import re

# 保留你原有正则定义
dmgEvent_P = re.compile(r'"([\w\s]+)<.*hurt "([\w\s]+)<.*\(dmg "(\d+)"')
hpEvent_P = re.compile(r'"([\w\s]+)<.*healed "([\w\s]+)<.*\(hp "(\d+)"')
roundStart_P = re.compile(r'trigger "(Round_Start)"')
gameOver_P = re.compile(r'trigger "(Game_Over)"')

# 解析状态标记,默认未进入有效区间
start_parsing = False

# 大日志建议直接逐行读文件,不需要全量加载到内存
with open("你的日志文件路径.log", "r", encoding="utf-8") as f:
    for line in f:
        # 未进入有效区间时,只匹配开局事件
        if not start_parsing:
            if roundStart_P.search(line):
                start_parsing = True
                # 若Round_Start事件本身需要统计,可在此处添加处理逻辑
            continue
        # 匹配到结束事件直接终止遍历
        if gameOver_P.search(line):
            break
        # 处于有效区间内,处理各类业务事件
        # 处理伤害事件
        dmg_match = dmgEvent_P.search(line)
        if dmg_match:
            dealer = dmg_match.group(1)
            receiver = dmg_match.group(2)
            dmg = int(dmg_match.group(3))
            modifyDMG(dealer, receiver, dmg)
            # 若一行仅存在一个事件,加continue可跳过后续匹配提升效率
            continue
        # 处理治疗事件
        hp_match = hpEvent_P.search(line)
        if hp_match:
            dealer = hp_match.group(1)
            receiver = hp_match.group(2)
            hp = int(hp_match.group(3))
            modifyHP(dealer, receiver, hp)
            continue
        # 后续新增其他事件匹配,直接在此处加对应分支即可

方案2:截取有效区间后全量匹配

如果不想改动原有全量匹配的逻辑,可先定位有效区间的首尾位置,截取内容后直接复用原有统计逻辑,改造成本极低。

# 第一步:定位有效区间的首尾索引
# 找第一个Round_Start的起始位置
round_start_match = roundStart_P.search(contents)
if not round_start_match:
    # 无有效开局事件的异常处理逻辑自行补充
    pass
start_idx = round_start_match.start()

# 从开局位置向后找Game_Over的结束位置
game_over_match = gameOver_P.search(contents, start_idx)
if not game_over_match:
    # 无有效结束事件的异常处理逻辑自行补充
    pass
end_idx = game_over_match.end()

# 截取有效区间的日志内容
valid_contents = contents[start_idx:end_idx]

# 第二步:原有全量匹配逻辑直接复用,仅替换入参为有效区间内容即可
matches = dmgEvent_P.finditer(valid_contents)
for match in matches:
    dealer = match.group(1)
    receiver = match.group(2)
    dmg = int(match.group(3))
    modifyDMG(dealer, receiver, dmg)
matches = hpEvent_P.finditer(valid_contents)
for match in matches:
    dealer = match.group(1)
    receiver = match.group(2)
    hp = int(match.group(3))
    modifyHP(dealer, receiver, hp)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:15:03