向后看和向前看的麻烦



我很难让这个简单的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}|-)(.*?)(?=sd{2}s)'
regex = re.findall(pattern,text,re.MULTILINE))'

当前输出:

Windows Event Logs Cleared

预期输出:

Windows Event Logs Cleared
Account Configured with Never-Expiring Password

注意:

  1. 日期和时间总是相同的模式
  2. 消息开始于3位数字或4位数字之前(在这些示例中为104和4738),但它也可以是-
  3. 消息长度变化
  4. 消息总是在2位数字之前结束,在这些例子中,第一个是21,第二个是47。

如果有人知道一个好的、简明的、没有官样文章的教程,请告诉我。

您可以再往后看一点,从作为时间戳一部分的最后一个冒号开始。

如果使用regex模块(而不是re)这样做,则可变宽度查看是可能的,但使用re,您可以以这种方式将其拆分为多个可选的固定宽度查看断言:

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

如果使用regex,那么您甚至可以使用K而不是查看后面的断言:

:dd (?:d{3,4}|-) K(.*?)(?=sd{2}s)

对于标准Pythonre,回溯必须是固定长度。由于消息的前面可以有一个可变长度的数字,因此不能使用后看(第三方regex库克服了这个限制)。

解决方法是为想要提取的消息使用捕获组。

regexp的另一个问题是它与消息之前的日期和时间不匹配。

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

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

最新更新