regex 向后看和向前看的问题

r7knjye2  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(162)

我很难让这个简单的RegEx工作。我需要捕获消息“*Windows事件日志已清除 *”或任何其他可能在该位置的消息。

text = """2023-04-05 / 15:53:58 104 Windows Event Logs Cleared 21 low SRVR3 - j.smith 1
          2023-03-20 / 15:17:55 4738 Account Configured with Never-Expiring Password 47 medium DC02SRV - m.rossi 2"""
pattern = '(?<=\d{3}|\d{4}|-)(.*?)(?=\s\d{2}\s)'
regex = re.findall(pattern,text,re.MULTILINE))'

电流输出:

Windows Event Logs Cleared

预期输出:

Windows Event Logs Cleared
Account Configured with Never-Expiring Password

注意事项:
1.日期和时间总是相同的模式
1.消息开始于3位数或4位数之前(在这些示例中为104和4738),但也可以是-
1.这条消息长短不一
1.消息总是在2位数字之前结束,在这些示例中,第一位数字是21,第二位数字是47。
如果有人知道一个好的,简洁的,官样文章免费教程,请让我知道。

twh00eeo

twh00eeo1#

您可以看得更远一些,从作为时间戳一部分的最后一个冒号开始。
如果使用regex模块(而不是re)执行此操作,则可以使用可变宽度的look-behind,但使用re,您可以通过以下方式拆分为多个可选的固定宽度look-behindAssert:

(?:(?<=:\d\d \d{3} )|(?<=:\d\d \d{4} )|(?<=:\d\d - ))(.*?)(?=\s\d{2}\s)

如果使用regex,那么你甚至可以使用\K来代替look behindAssert:

:\d\d (?:\d{3,4}|-) \K(.*?)(?=\s\d{2}\s)
93ze6v8z

93ze6v8z2#

对于标准Python re,lookbehind必须是固定长度的。由于消息前面可以有一个可变长度的数字,因此不能使用lookbehind(第三方regex库克服了这个限制)。
解决方法是对要提取的消息使用捕获组。
regexp的另一个问题是它与消息之前的日期和时间不匹配。

pattern = r'^\d{4}-\d{2}-\d{2} / \d{2}:\d{2}:\d{2} (?:-|\d{3,4}) (.*?) \d{2}'

使用此选项时,捕获组1将包含该消息。

相关问题