我期待一个空字符串,因为我特意否定了这个词 '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']
有人可以解释为什么会失败吗?
答案 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"/>
则不会。