我是正则表达式的新手。我写了以下正则表达式来查找给定字符串中的abababab9
。正则表达式返回两个结果,但我期待一个结果。
testing= re.findall(r'((ab)*[0-9])',temp);
**Output**: [('abababab9', 'ab')]
根据我的理解,它应该只返回abababab9
,为什么它单独返回ab
。
答案 0 :(得分:2)
你没有'阅读findall
文档:
返回字符串中所有非重叠匹配的列表。
如果模式中存在一个或多个捕获组,则返回组列表; 如果模式具有,则这将是元组列表 不止一个小组。
结果中包含空匹配。
如果你看一下re
模块,捕获组是括号内的子模式,如(ab)
。
如果您只想获得完整匹配,可以使用以下解决方案之一:
re.findall(r'(?:ab)*[0-9]', temp) # use non-capturing groups
[groups[0] for groups in re.findall(r'(ab)*[0-9]', temp)] # take the first group
[match.group() for match in re.finditer(r'(ab)*[0-9]', temp)] # use finditer
答案 1 :(得分:1)
您已由(...)
两个匹配组配置第一组为((ab)*[0-9])
,第二组为(ab)
。因此,你得到这两个结果。要获得第一组,您可以将第二组设为非捕获组。这是由?:
完成的。所以这个结果没有交付。
((?:ab)*[0-9])
这只匹配abababab9
。
修改1:
以下是正则表达式分组概念的解释:groups and capturing
答案 2 :(得分:0)
使用(ab)
内部删除第二个捕捉?:
的群组:
testing= re.findall(r'((?:ab)*[0-9])',temp);