为什么在与群组匹配时,findall不会返回整个匹配项?

时间:2016-04-10 06:49:18

标签: python regex

我阅读(dog|cat)food时会查找dog foodcat food,但我无法用我的案例重现它。

>>> for m in re.findall('RA[a-zA-Z0-9]*',"RAJA45909"):
    print(m)


RAJA45909
>>> for m in re.findall('(ra|RA)[a-zA-Z0-9]*',"RAJA45909"):
    print(m)


RA
>>> 

有人可以帮助我理解这一点。

2 个答案:

答案 0 :(得分:2)

您应该使用re.finditer代替re.findall,然后打印整个匹配组:

>>> for m in re.finditer('(ra|RA)[a-zA-Z0-9]*',"RAJA45909"):
...     print(m.group())
... 
RAJA45909

findall的文档说:

  

如果模式中存在一个或多个组,则返回列表   组;如果模式有多个,这将是一个元组列表   基。

您的正则表达式只有一个组,因此结果是该单个组匹配的文本列表。如果我们添加其他组,您会看到:

>>> for m in re.findall('(ra|RA)([a-zA-Z0-9]*)',"RAJA45909"):
...     print(m)
... 
('RA', 'JA45909')

所以findall与组一起使用时匹配整个正则表达式,但只返回组匹配的部分。虽然finditer始终返回完整的匹配对象。

答案 1 :(得分:0)

您可以使用此

print(re.findall('((?:ra|RA)[a-zA-Z0-9]*)',"RAJA45909"))

<强> Ideone Demo