Regex日志解析-如何在一个事件中开始解析行并在另一个事件中停止解析行?



我有一个日志文件,每行记录几个游戏事件,但这也包括在"官方"游戏时间之外发生的事件(即游戏前等)。我有预定义的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)
    • )*关闭非捕获组并可选地重复
  • )关闭捕获组1
  • n.*?btrigger "(Game_Over)"匹配换行符,匹配触发器"(Game_Over)"在

Regex演示

注意转义括号(),否则"(Round_Start)"将不匹配,并且只有(Round_Start)将捕获捕获组中的文本。

最新更新