正则日志解析:如何从首个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
相关产品推荐
相关产品推荐

