python

时间:2016-07-19 08:31:56

标签: python regex expression

我有两行以下的日志,我希望有一个单独的正则表达式来查找每一行。在第二个日志行上触发没有问题。但是我为第一行设计表达式有问题。名称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进行测试。 在此链接下,您可以找到我的实验的最新版本。

任何人都知道我在哪里遇到错误? 无论如何可能触发这种情况? 也许我应该分两步完成它?

1 个答案:

答案 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.),它会立即失败。尽可能多地使用换行符以外的字符(.*)。

相关问题