python中的负前瞻断言

python中的负前瞻断言,python,regex,expression,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

下面是两行日志,我希望有单独的正则表达式来查找它们。在第二个日志行触发没有问题。但是我在为第一行设计表达式时遇到了问题。名称
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\.$)
我想区分两种情况: 我基于这里给出的例子。

当它以这样的方式结束时,一切正常:(当然我必须修改我的测试字符串)

当我尝试做一些更适合我的事情时,例如:(我的
完成了。
末尾有点)

然后就变得很奇怪了。 另一个改编<代码>完成。后面应该跟空格,而不是点,结果会很糟糕。每一行都给出了积极的发现

[.](?!done\.$)
我一直在测试。 在这个链接下你可以找到我的实验的最新版本

有人知道我哪里有臭虫吗? 在这种情况下有可能触发吗?
也许我应该分两步进行?

如果您想在
完成的情况下排除匹配行。
最后,您需要使用负前瞻,并更好地定位在行的开头:

^(?!.* done\.$)([0-9.]+\s+[\d:]+)\s+SCR_OUTPUT:\s*####\s*(TC_\w+).*
 ^^^^^^^^^^^^^^
请参阅(如果有多行字符串输入,请记住使用
re.M
标志使
^
匹配行的开头,而不是字符串的开头)

注意,我为您提供的字符串增强了ReXEX模式(初始部分转到([09+] +[s+[\d:] +)s+< /c>大大减少回溯,如果这个精确模式与所有数据不匹配,您应该考虑使用类似的东西)。


无论如何,最重要的一点是前瞻
(?!.*done\.$)
,它在检查是否有空格+
完成后立即使匹配失败。
在结尾(
done.
)0+个字符之后,而不是换行符,尽可能多(
*
).

当一行/字符串以
结束时,是否要使匹配失败。
?或者(哪个更快)?没错。无论何时给出带有“完成”的行,它都会失败。此外,
[a-fA-F0-9]=\w
[:0-9]=[:\d]
@pwnsauce我需要它在十六进制范围内,因此\w不适合这里。但是谢谢,谢谢。这正是,什么是工作。这一课我在任何例子中都没有见过。如果日期是一个时间,我会用尽可能短的模式,只是为了缩短它。这部分在我的问题中无论如何都不重要。但是谢谢你的建议,我会考虑的。是的,你可以使用<代码> [09]:+ /代码>使它“短”,但是<代码> */> >烧毁<代码> SCRSUputs是一个过激的行为。此外,请记住,“更短”并不意味着“更高效”,在正则表达式世界中几乎从来没有“更精确”的意思。在这种情况下,
*
是我明显的错误(在实验中迷失了方向)。我所说的“更短”只是指这里的演示文稿,以避免滚动条,而不是为了提高效率。我从表达式中删除了这个
*
..]*)。.SCR\u OUT…
以避免愚弄任何人。
[.](?!done\.$)
^(?!.* done\.$)([0-9.]+\s+[\d:]+)\s+SCR_OUTPUT:\s*####\s*(TC_\w+).*
 ^^^^^^^^^^^^^^