1

我打开这个问题是因为我原来的问题似乎需要一个新的方向:我原来的问题

我想创建一个正则表达式,可以从以下类型的日志条目中提取静态消息和动态消息:

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE 静态消息;动态消息

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.NAME TYPE THREAD.OR.CONNECTION.INFORMATION 静态消息;动态消息

一种日志条目类型具有简单的结构:

file:date TYPE STATIC;DYNAMIC

尝试用正则表达式解析时,另一个不是那么简单:

file:date MODULE.NAME TYPE CONNECTION.OR.THREAD STATIC;DYNAMIC

其中MODULE.NAMEandCONNECTION.OR.THREAD要么都存在要么不存在。

到目前为止,我适用于第一种日志条目的正则表达式是:

(?:.*?):(?:\w{3} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2})(?:\s+?)(?:[\S|\.]*?(?:\s*?))?(?:(?:TYPE1)|(?:TYPE2)|(?:TYPE3))(?:\s+?)(?:\S+?(?:\s+?))?(.+){1}(?:;(.+)){1}

但每当我进入第二种类型的条目时,我也会将 CONNECTION.OR.THREAD 作为我的第一个捕获组的一部分。

我希望有一种方法来使用前瞻或后视功能,以便我可以捕获STATICDYNAMIC忽略该CONNECTION.OR.THREAD部分(如果有MODULE.NAME

我希望这个问题很清楚,如果看起来有点暗淡,请参考我的原作。谢谢你。

编辑:澄清。日志的每一行都不同,每一行都以文件路径开头,然后:是日期,格式如下:MMM DD HH:MM:SS然后它变得很棘手,要么是MODULE.NAME变化的,其次是变化的,然后是TYPE变化CONNECTION.OR.THREAD的变化,或只有TYPE. 之后有STATIC MESSAGEthen a ;then aDYNAMIC MESSAGE静态和动态消息都不同,该术语的使用STATIC仅仅是因为错误可能是例如“无法连接到服务器;server1.com”所以错误的静态部分是“无法连接到服务器”,动态部分是“server1.com”

4

1 回答 1

0

目前我已经制作了这个庞大的正则表达式:

(?:(?:.*?):(?:\w{3}(?: \d{1,2}){2}(?::\d{1,2}){2}))(?:\s+?)(?:(?:(?:(?:TYPE1)|(?:(?:TYPE1)|(?:TYPE3))(?:\s+?)(?:(.+){1};(.+){1}))|(?:\S+(?:\.\S+)+)(?:\s+?)(?:(?:TYPE1)|(?:TYPE1)|(?:TYPE3))(?:\s+?)(?:\S+(?:\.\S+)+)(?:\s+?)(?:(.+){1};(.+){1})))

我将它分成几部分:

文件/日期 + 空格:

(?:(?:.*?):(?:\w{3}(?: \d{1,2}){2}(?::\d{1,2}){2}))(?:\s+?)

然后是:

简单:(静态类型;动态)

(?:(?:(?:TYPE1)|(?:TYPE1)|(?:TYPE3))(?:\s+?)(?:(.+){1};(.+){1}))

或复杂:(模块。名称类型连接。或。线程静态;动态)

(:?(?:\S+(?:\.\S+)+)(?:\s+?)(?:(?:TYPE1)|(?:TYPE1)|(?:TYPE3))(?:\s+?)(?:\S+(?:\.\S+)+)(?:\s+?)(?:(.+){1};(.+){1}))

它成功了。但它很大,我认为它可以改进。所以请如果有人可以改进它,请做。

编辑:

但是有一个问题。因为现在有 4 个捕获组。所以我无法提前知道我是否必须查看捕获的 [0:1] 或捕获的 [2:3] 以获得我的结果。任何人都有办法做到这一点,如果我有东西,我就不必每次都检查?或者可能是一种从结果中消除空捕获组的方法,或者可能只从结果列表中获取非空结果?某物?我的大脑被炸了。

编辑2:

正如@martijn pieters 建议的那样,我删除了无关的分组,这是我当前的正则表达式:

.*?:\w{3}(?: \d{1,2}){2}(?::\d{2}){2}\s+?(?:(?:(?:TYPE1|TYPE2|TYPE3)\s+?(.+){1};(.+){1})|(?:\S+(‌​?:\.\S+)+\s+?(?:TYPE1|TYPE2|TYPE3)\s+?\S+(?:\.\S+)+\s+?(.+){1};(.+){1}))

效果很好。我担心(?:TYPE1|TYPE2|TYPE3)被误解,因为TYPE(1|T)YPE(2|T)YPE3任何见解都会受到赞赏。

另外,如何最好地解析我的结果 - 看到我将得到一个包含 4 个项目的列表,其中前 2 个或第二个 2 为空,另一个具有我的静态/动态结果。

编辑3:

好的,我已经做了一个混合解决方案。我重新制作了我的正则表达式:

.*?:\w{3}(?: \d{1,2}){2}(?::\d{2}){2}\s+?(?:(?:(?:TYPE1|TYPE2|TYPE3))|(?:\S+(?:\.\S+)+\s+?(?:TYPE1|TYPE2|TYPE3)\s+?\S+(?:\.\S+)+))\s+(.*)

我现在只有 1 个捕获组,即 STATIC;DYNAMIC 部分。一旦我得到这个,我就会做我以前做的事情(见我以前的问题

for item in captured:
    parts = item.split(";")
    static = parts[0]
    dynamic = ";".join(parts[1:])

那是我的解决方案。感谢@Martijn Pieters,特别是您的帮助。我希望这可以帮助将来的人。

于 2012-09-03T14:25:51.403 回答