不懂懒惰的正则表达式 - python

假设我们有一个字符串1abcd1efg1hjk1lmn1,并且想在1 -s之间找到东西。我们要做的是

re.findall('1.*?1','1abcd1efg1hjk1lmn1')

得到两个结果

['1abcd1', '1hjk1']

好的,我明白了。但是如果我们这样做

re.findall('1.*?1hj','1abcd1efg1hjk1lmn1')

为什么它在1之间抓取两个间隔而不是一个?为什么我们得到['1abcd1efg1hj']而不是['1efg1hj']?这不是应该懒惰吗?

python大神给出的解决方案

正则表达式始终尝试从左到右匹配输入字符串。考虑您的'1.*?1hj'正则表达式。正则表达式中的1与第一个匹配,而后面的.*?则非贪婪地匹配直到1hj子字符串的所有字符。这样您得到的是['1abcd1efg1hj']而不是['1efg1hj']

要获取['1efg1hj']作为输出,您需要使用否定的类作为1[^1]*1hj

>>> s = "1abcd1efg1hjk1lmn1"
>>> re.findall(r'1.*?1hj', s)
['1abcd1efg1hj']
>>> re.findall(r'1[^1]*1hj', s)
['1efg1hj']