正则表达式在日志

时间:2017-02-09 15:38:44

标签: regex lookahead logparser

https://regex101.com/r/9kfa7D/4

我永远无法让前瞻部分正确无误。我已经尝试了一些不同的东西,但我试图进入下一个日期并像那样解析它。主要是因为我不知道消息会是什么样子,而且可能是随机的。任何帮助都会很棒。

我需要对其中的消息部分进行分组。

编辑:更新以使其更清楚我正在尝试做什么。从来没有从每个日期开始。

4 个答案:

答案 0 :(得分:2)

你可以调整你的正则表达式,而不是像这样修改前瞻:

^\d{2}-\w{3}-\d{4} (?:\d{2}:){2}\d{2}\.\d{3}

Updated Regex Demo

修改

根据更新的问题,OP可以使用这种基于正面的负面预测来捕获日志文本:

^[^\[]+\[[^\]]+\] +[^:]+ +(.*(?:\n(?!\d{2}-[a-zA-Z]{3}-).*)*)

此正则表达式不会通过在最后一个段中展开循环来使用DOTALL标志。这使得上面的正则表达式非常快,可以完成解析。

New Demo

答案 1 :(得分:0)

import wx class MainFrame(wx.Frame): def __init__(self, *args, **kwds): # kwds["pos"] = (10,10) self.frame = wx.Frame.__init__(self, *args, **kwds) self.SetTitle("Move around the screen") self.InitUI() def InitUI(self): self.location1 = wx.Point(-30,-100) self.location2 = wx.Point(500,500) self.panel1 = wx.Panel(self) self.button1 = wx.Button(self.panel1, -1, label="Move", size=(80,25), pos=(10,10)) self.button1.Bind(wx.EVT_BUTTON, self.OnItem1Selected) self.Show() self.Move(self.location1) def OnItem1Selected(self, event): self.MoveAround() def MoveAround(self): curr_location = self.GetPosition() #or self.GetPositionTuple() if curr_location == self.location1: print ("moving to ", self.location2) self.Move(self.location2) else: print ("moving to ", self.location1) self.Move(self.location1) if __name__ == '__main__': app = wx.App() frame = MainFrame(None) app.MainLoop()

第一部分是日期模式,因为您不想保留日期,所以它是非分组的。

第二部分是^(?:\d{2}-\w{3}-\d{4} (?:\d{2}:){2}\d{2}\.\d{3}) ((?:[^\n]+(?:\n+(?!\d{2}-\w{3}-\d{4})|))+),后跟[^\n]+,前提是\n后面没有(因此前面是负面的)。

然后重复第二部分。

您可以在regex101上看到该演示。

答案 2 :(得分:0)

如果您关心日志时间戳之间的消息,请使用此消息(它在第2组中):

/(\d{2}-\w{3}-\d{4} \S+ \S+ \[[^\]]++\] )(?=(.+)((?1)|\z))/gms

答案 3 :(得分:0)

您需要什么
bootstrab

如何运作
许多人喜欢复杂的思维,因为他们正面对一个正则表达式。但你应该确切地知道你想要什么。

你只需要匹配这个:(^\d+.[A-Z].*?)[A-Z]而不是别的。让我们开始吧:

首先:29-Jun-2016 09:33:43.565 INFO
下一个:two digit,
下一个:A word with capital letter
光洁度。

主要规则 非贪婪的mantch:everything from this word to the next capitalize word

prove

注意
你想从头到尾匹配.*?
非常简单,只需在最后添加log即可。而已。

您是否注意过它需要采取多少步骤?

enter image description here

我的第一个:7952
我的第二个:13751
将它与其他

进行比较
  

把照片放在这里。有些人更新他们的正则表达式。我做   不想争论。没问题。我只是想表现出来。   否则我可以(尽可能)通过具体的选择减少它   模式例如:.*?log现在^\d+-[A-Za-z]+-\d+\s\d+:\d+:\d+\.\d+成为7952

您想了解 lock-head 断言的工作原理吗? 很容易。主要概念是3878永远不会匹配任何东西。它只能匹配位置只需一个点。
喜欢:
(?=)
它仍匹配:^\d+-[A-Z].+(?=[A-Z]+ ).
最后注意29-Jun-2016 09:33:43.565 INFO。所以这里的头部断言指向.F之间

如果想匹配此O,那么你能做什么?
想一想:
29-Jun-2016 09:33:43.565
并自己弄明白。