不需要的行为归结为您制定正则表达式的方式:
rexp=re.compile("(aa|bb)+")
括号(aa|bb)
形成一个组。
如果我们查看findall 的文档,我们会看到:
返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,
则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一匹配的开头。**
当你组成一个组时,它首先计算aa
,然后bb
,然后aa
再计算(因为+
量词)。所以这个组aa
最终成立。并findall
在列表中返回此值(由于整个表达式['aa']
只有一个匹配项,因此列表仅包含一个保存在组中的元素)。aabbaa
aa
从您提供的代码中,您似乎想要这样做:
>>> rexp=re.compile("(?:aa|bb)+")
>>> rexp.findall(sequence)
['aabbaa']
(?: ...)
不创建任何组,因此findall
返回整个表达式的匹配项。
在您的问题结束时,您会显示所需的输出。这是通过寻找aa
or来实现的bb
。不需要量词 (+
或*
)。按照 Inbar Rose 的回答中的方式进行操作:
>>> rexp=re.compile("aa|bb")
>>> rexp.findall(sequence)
['aa', 'bb', 'aa']