我有两行以下的日志,我希望有一个单独的正则表达式来查找每一行。在第二个日志行上触发没有问题。但是我为第一行设计表达式有问题。名称Reset Reason test
只是一个测试示例,其中的单词数量可能会有所不同,因此我无法在此定义任何更具体的模式,只需.*
。
12.07.2016 13:54:20 SCR_OUTPUT: #### TC_0006 Reset Reason test
12.07.2016 13:54:20 SCR_OUTPUT: #### TC_0006 Reset Reason test done.
我有正常的表达方式,通常做我想做的事情:
([0-9:. ]*) SCR_OUTPUT: #### (TC_[a-fA-F0-9]{4,5}[:0-9]{0,4}) .*[ ](?!done\.$)
我有两个案例需要区分: 我基于这里给出的例子。 https://docs.python.org/3/howto/regex.html#lookahead-assertions
当它结束时一切正常:(当然我必须修改我的测试字符串)
[.](?!done$)
当我尝试更适合我的东西时,例如:(我的done.
最后有点)
[.](?!done\.$)
然后它变得奇怪。
另一个适应。 done.
应该跟空格而不是点,结果会变得疯狂。每一行都给出了积极的发现。
[.](?!done\.$)
我一直在pythex.org进行测试。 在此链接下,您可以找到我的实验的最新版本。
任何人都知道我在哪里遇到错误? 无论如何可能触发这种情况? 也许我应该分两步完成它?
答案 0 :(得分:1)
如果你想在最后用 done.
排除匹配的行,你需要使用负前瞻,并且更好地锚定在行的开头:
^(?!.* done\.$)([0-9.]+\s+[\d:]+)\s+SCR_OUTPUT:\s*####\s*(TC_\w+).*
^^^^^^^^^^^^^^
请参阅regex demo(如果您有多行字符串输入,请记住使用re.M
标志使^
与行的开头匹配,而不是字符串start。
注意我增强了你提供的字符串的正则表达式模式(初始部分转向([0-9.]+\s+[\d:]+)\s+
大大减少了回溯,如果这个确切的模式与你的所有数据不匹配,你应该考虑使用类似的东西)。
无论如何,核心兴趣点是前瞻(?!.* done\.$)
,一旦检查到0 +之后是否有空格+ done.
( done.
),它会立即失败。尽可能多地使用换行符以外的字符(.*
)。