我很难让这个简单的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。
如果有人知道一个好的,简洁的,官样文章免费教程,请让我知道。
2条答案
按热度按时间twh00eeo1#
您可以看得更远一些,从作为时间戳一部分的最后一个冒号开始。
如果使用
regex
模块(而不是re
)执行此操作,则可以使用可变宽度的look-behind,但使用re
,您可以通过以下方式拆分为多个可选的固定宽度look-behindAssert:如果使用
regex
,那么你甚至可以使用\K
来代替look behindAssert:93ze6v8z2#
对于标准Python
re
,lookbehind必须是固定长度的。由于消息前面可以有一个可变长度的数字,因此不能使用lookbehind(第三方regex
库克服了这个限制)。解决方法是对要提取的消息使用捕获组。
regexp的另一个问题是它与消息之前的日期和时间不匹配。
使用此选项时,捕获组1将包含该消息。