正则表达式负面外观未按预期工作



在python中,我使用了这个regex

(?<!ddd)(s?lt.?s?blue)

在这个字符串上

ltblue
500lt.blue
4009 lt blue
lt. blue
032 lt red

我希望它能捕捉到这个

ltblue
lt. blue

但它却捕获了

ltblue
lt. blue
lt blue

从我写它的方式来看,我认为它不应该在4009年后捕捉到"lt blue",但出于某种原因?在"lt"似乎不起作用之前,有人知道我如何更改正则表达式以获得预期的输出吗?

Regex将尽力匹配您的模式,因此如果s是可选的,它将尝试使用和不使用,并保持匹配。在4009 lt blue的情况下,如果组中没有空间,则匹配(该空间在组之前,欺骗了您的后备人员(。

由于lookbehinds在python中必须具有固定的宽度,因此您不能将s?添加到负lookbehind中,但您仍然可以在另一个例子中处理这种情况:

(?<!d{3})(?<!d{3}s)(lt.?s?blue)

如果数字总是出现在字符串的开头,并且在任何一行的数字之前都没有任何内容,则可以使用以下方法:^(?![d ]+)(lt[ .]*blue)

演示:https://regex101.com/r/sR18Rz/1

您的模式匹配"4009 lt blue"的原因是,在l之前,s?与空白匹配零次,并且"l"前面没有三个数字。

作为替代方案,您可以使用Pypi regex模块将可选的s?添加到查找表中,并且您可以仅为匹配而省略捕获组。

import regex as re
pattern = r"(?<!ddds?)lt.?s?blueb"
s = ("ltbluen"
"500lt.bluen"
"4009 lt bluen"
"lt. bluen"
"032 lt red")
print(re.findall(pattern, s))

请参阅regex演示和Python演示。

输出

['ltblue', 'lt. blue']

最新更新