我有一个日志文件,每行记录几个游戏事件,但这也包括在"官方"游戏时间之外发生的事件(即游戏前等)。我有预定义的regex模式,可以读取和解析每个事件,并汇总这些统计数据,尽管这包括在正式回合之前和之后发生的多余统计数据。
我的统计聚合目前很好,我目前正在努力分析两个事件之间的范围。游戏中没有明确的"游戏开始"事件,但有一个"回合开始"事件,该事件计算在比赛中开始的每一个回合。游戏结束更简单,因为"游戏结束"是一个被记录的事件。
如果我能够读取'round start'事件和'game over'事件,我如何能够在'round start'的第一个实例开始读取文件中的行,并在触发游戏结束后完成读取行?
eg:
line 37 | trigger "(Round_Start)" <-- begin parsing here
...
line 192 | trigger "(Round_Start)"
...
line 304 | trigger "(Round_Start)"
...
line 486 | trigger "(Round_Start)"
...
line 594 | trigger "(Game_Over)" <-- finish parsing here
查看下面的代码可能会有所帮助。
dmgEvent_P = re.compile(r'"([ws]+)<.*hurt "([ws]+)<.*(dmg "(d+)"')
hpEvent_P = re.compile(r'"([ws]+)<.*healed "([ws]+)<.*(hp "(d+)"')
roundStart_P = re.compile(r'trigger "(Round_Start)"')
gameOver_P = re.compile(r'trigger "(Game_Over)"')
matches = dmgEvent_P.finditer(contents)
for match in matches:
dealer = match.group(1)
receiver = match.group(2)
dmg = int(match.group(3))
modifyDMG(dealer, receiver, dmg)
matches = healthEvent_P.finditer(contents)
for match in matches:
dealer = match.group(1)
receiver = match.group(2)
hp = int(match.group(3))
modifyHP(dealer, receiver, hp)
还有其他游戏内部事件被跟踪,但它们的功能非常相似。
目前,我当前的代码通过每个regex解析函数完全读取日志内容来解析所有事件,而不是一行一行地解析。我希望能够在我上面定义的范围内共同解析这些行。
可以匹配trigger "(Round_Start)"
并读取不包含trigger "(Game_Over)"
的所有行
^.*?btrigger "(Round_Start)".*(?:n(?!.*(Game_Over)).*)*
Regex演示
如果(Game_Over)应该在行之后出现,你可以在捕获组中捕获它之前的行,并匹配之后包含(Game_Over)
的行^(.*?btrigger "(Round_Start)".*(?:n(?!.*(Game_Over)).*)*)n.*?btrigger "(Game_Over)"
模式匹配
^
字符串起始(
Capturegroup 1.*?btrigger "(Round_Start)".*
匹配包含触发器"(Round_Start)">(?:
非捕获组作为整个部分重复n(?!.*(Game_Over)).*
匹配换行,如果它不包含(Game_Over),则使用负向前看。如果想要排除更多行,可以使用(?!.*(?:(Game_Over)|another string)
)*
关闭非捕获组并可选地重复
)
关闭捕获组1n.*?btrigger "(Game_Over)"
匹配换行符,匹配触发器"(Game_Over)"在 行
Regex演示
注意转义括号(
和)
,否则"(Round_Start)"
将不匹配,并且只有(Round_Start)
将捕获捕获组中的文本。