https://regex101.com/r/9kfa7D/4
我永远无法让前瞻部分正确无误。我已经尝试了一些不同的东西,但我试图进入下一个日期并像那样解析它。主要是因为我不知道消息会是什么样子,而且可能是随机的。任何帮助都会很棒。
我需要对其中的消息部分进行分组。
编辑:更新以使其更清楚我正在尝试做什么。从来没有从每个日期开始。
答案 0 :(得分:2)
你可以调整你的正则表达式,而不是像这样修改前瞻:
^\d{2}-\w{3}-\d{4} (?:\d{2}:){2}\d{2}\.\d{3}
修改强>
根据更新的问题,OP可以使用这种基于正面的负面预测来捕获日志文本:
^[^\[]+\[[^\]]+\] +[^:]+ +(.*(?:\n(?!\d{2}-[a-zA-Z]{3}-).*)*)
此正则表达式不会通过在最后一个段中展开循环来使用DOTALL
标志。这使得上面的正则表达式非常快,可以完成解析。
答案 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
注意强>
你想从头到尾匹配.*?
非常简单,只需在最后添加log
即可。而已。
您是否注意过它需要采取多少步骤?
我的第一个: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
并自己弄明白。