python re.findall()在替换中使用子字符串

时间:2013-12-18 00:25:02

标签: python regex

如果我在正则表达式中有另一个字符串或模式的子字符串(或“子模式”),就像这样:

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会贪婪地返回匹配但很明显,它会回溯并尝试匹配可能产生更长令牌的替代模式。

1 个答案:

答案 0 :(得分:3)

根本没有回溯。您的模式匹配两种不同类型的字符串; |表示。每个模式都在每个位置进行尝试。

因此,当表达式在输入开头找到abcd时,该文本与您的模式完全匹配,它符合(abcd 或<的bc部分/ em> abcd)你给它的模式。

这里没有替代部件的排序,就正则表达式引擎而言,abcd|bc与<{1}}是相同的事情bc|abcd不会被忽视,因为abcd可能会在字符串中稍后匹配。