负向前看产生意想不到的结果

时间:2017-08-30 18:07:49

标签: python regex python-3.x regex-lookarounds

我期待一个空字符串,因为我特意否定了这个词 'authentication'在我的字符串中。

string ='INFO 2013-09-17 12:13:44,487 authentication failed'

pattern = re.compile(r'\w+\s[\d-]+\s[\d:,]+\s(.*(?!authentication\s)failed)')

re.findall(pattern, string)
['authentication failed']

有人可以解释为什么会失败吗?

1 个答案:

答案 0 :(得分:1)

您的.*模式与failed之前的任何内容匹配。那个任何本身不应该跟authentication加上1个空白字符。这种限制很容易实现;在authentication之后没有'authentication '空格。{/ p>

反转前瞻;使用负面的lookbehind((?<!...))代替。如果failed之前没有authentication,则仅匹配pattern = re.compile(r'\w+\s[\d-]+\s[\d:,]+\s(.*(?<!authentication\s)failed)')

.*

现在文字不匹配; failed无法匹配任何内容,因为其后面没有有效的authentication文字,前面没有matching failed

我在https://regex101.com/r/yGW7rH/1进行了演示;请注意,带有文字authentication failed的第二行会产生匹配,而<EditText ... android:drawableLeft="@drawable/some_drawable" android:drawablePadding="10dp"/> 则不会。