如果我在正则表达式中有另一个字符串或模式的子字符串(或“子模式”),就像这样:
r'abcd|bc'
re.compile(r'abcd|bc').findall('abcd bcd bc ab')
的预期行为是什么?
尝试一下,我得到(正如预期的那样)
['abcd', 'bc', 'bc']
所以我认为re.compile(r'bc|abcd').findall('abcd bcd bc ab')
可能会产生['bc', 'bc', 'bc']
,但它会再次返回
['abcd', 'bc', 'bc']
有人可以解释一下吗?我的印象是findall
会贪婪地返回匹配但很明显,它会回溯并尝试匹配可能产生更长令牌的替代模式。
答案 0 :(得分:3)
根本没有回溯。您的模式匹配两种不同类型的字符串; |
表示或。每个模式都在每个位置进行尝试。
因此,当表达式在输入开头找到abcd
时,该文本与您的模式完全匹配,它符合(abcd
或<的bc
部分/ em> abcd
)你给它的模式。
这里没有替代部件的排序,就正则表达式引擎而言,abcd|bc
与<{1}}是相同的事情。 bc|abcd
不会被忽视,因为abcd
可能会在字符串中稍后匹配。