首页 > 解决方案 > 正则表达式:具有重复捕获组的 findall

问题描述

我想了解为什么:

re.findall(r"(\d[A-Za-z]+)", "My user name is 3e4r 5fg")

返回

['3e', '4r', '5fg']

尽管 :

re.findall(r"(\d[A-Za-z]+)+", "My user name is 3e4r 5fg")

返回

['4r', '5fg']

我测试了一些“数字字母”组之间有空格的组合,显然涉及2个点:

  1. 这些组之间的空间
  2. 最后一个“+”。

我真的不明白为什么在组后添加“+”会改变结果。有人可以向我解释导致这些不同答案的过程步骤吗?非常感谢。

标签: regex-group

解决方案


当您在括号后加上 + 时,您正在搜索包含一个或多个带有 1 个数字和(一个或多个)字母的子模式的模式,因此这个短语:"(\d[A-Za-z]+)+"return 2 匹配:

  1. 3e4r
  2. 5fg

当您将子模式放在括号中时,意味着所有匹配该子模式的都将进入一个组,组是:

  1. 3e
  2. 5fg

该函数re.findall仅返回组(除非没有组,则返回匹配项)。


推荐阅读