Python 唐’;我不懂lazy正则表达式

Python 唐’;我不懂lazy正则表达式,python,regex,lazy-evaluation,Python,Regex,Lazy Evaluation,假设我们有一个字符串1abcd1efg1hjk1lmn1,并希望在1-s之间查找内容。我们所做的是 re.findall('1.*?1','1abcd1efg1hjk1lmn1') 得到两个结果 ['1abcd1', '1hjk1'] 好的,我明白了。但如果我们这样做了 re.findall('1.*?1hj','1abcd1efg1hjk1lmn1') 为什么它在1s之间抓住两个间隔而不是一个?为什么我们得到的是['1abcd1efg1hj']而不是['1efg1hj']?这不是懒惰应该

假设我们有一个字符串
1abcd1efg1hjk1lmn1
,并希望在
1
-s之间查找内容。我们所做的是

re.findall('1.*?1','1abcd1efg1hjk1lmn1')
得到两个结果

['1abcd1', '1hjk1']
好的,我明白了。但如果我们这样做了

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

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

正则表达式总是尝试从左到右匹配输入字符串。考虑一下你的<代码> '*1HJ '/COD> ReXEX。正则表达式中的code>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']
你得到这个是因为它满足你的正则表达式<代码>1.*1hj基本上是指从
1
开始,然后缓慢移动,直到找到
1
,然后是
hj
。中间的
1
如果后跟
ef
,则不匹配,但
将消耗所有。您无法获得
['1efg1hj']
,因为该字符串已被第一个匹配项使用。请使用“向前看”查看两者是否都满足条件。见演示

前瞻不会使用字符串,因此您可以同时获得两个匹配项


单击
regex调试器
查看实际发生的情况regex引擎从左到右解析字符串,并始终给出最左边的结果,不管您使用什么量词。是的,在这种情况下,可以使用否定类。但假设您的“分隔符”是多字符,例如“123”而不是“1”。在这种情况下,你将如何解决这个问题?您不能使用
[^123]
,因为您仍然希望单个字符匹配,除非它们同时出现。
['1abcd1efg1hj']