在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']