字符串模式正则表达式python

字符串模式正则表达式python,python,regex,Python,Regex,我是正则表达式的新手。我编写了以下正则表达式来查找给定字符串中的abababab9。正则表达式返回两个结果,但我希望得到一个结果 testing= re.findall(r'((ab)*[0-9])',temp); **Output**: [('abababab9', 'ab')] 根据我的理解,它应该只返回abababab9,为什么它只返回ab使用?:删除捕获(ab)的第二组: testing= re.findall(r'((?:ab)*[0-9])',temp); 使用内部的?:移除

我是正则表达式的新手。我编写了以下正则表达式来查找给定字符串中的
abababab9
。正则表达式返回两个结果,但我希望得到一个结果

testing= re.findall(r'((ab)*[0-9])',temp);


**Output**: [('abababab9', 'ab')]

根据我的理解,它应该只返回
abababab9
,为什么它只返回
ab

使用
?:
删除捕获
(ab)
的第二组:

testing= re.findall(r'((?:ab)*[0-9])',temp);

使用内部的
?:
移除第二组捕获
(ab)

testing= re.findall(r'((?:ab)*[0-9])',temp);

使用内部的
?:
移除第二组捕获
(ab)

testing= re.findall(r'((?:ab)*[0-9])',temp);

使用内部的
?:
移除第二组捕获
(ab)

testing= re.findall(r'((?:ab)*[0-9])',temp);

您已通过
(…)
两个匹配组配置了第一组
((ab)*[0-9])
第二组
(ab)
。所以你得到了这两个结果。要仅获取第一个组,可以将第二个组设置为非捕获组。这是由
?:
完成的。因此,这一结果并未实现

((?:ab)*[0-9])

此项仅匹配
abababab9

编辑1:


下面是对正则表达式分组概念的解释:

您已通过
(…)
两个匹配组配置了第一组是
((ab)*[0-9])
第二组是
(ab)
。所以你得到了这两个结果。要仅获取第一个组,可以将第二个组设置为非捕获组。这是由
?:
完成的。因此,这一结果并未实现

((?:ab)*[0-9])

此项仅匹配
abababab9

编辑1:


下面是对正则表达式分组概念的解释:

您已通过
(…)
两个匹配组配置了第一组是
((ab)*[0-9])
第二组是
(ab)
。所以你得到了这两个结果。要仅获取第一个组,可以将第二个组设置为非捕获组。这是由
?:
完成的。因此,这一结果并未实现

((?:ab)*[0-9])

此项仅匹配
abababab9

编辑1:


下面是对正则表达式分组概念的解释:

您已通过
(…)
两个匹配组配置了第一组是
((ab)*[0-9])
第二组是
(ab)
。所以你得到了这两个结果。要仅获取第一个组,可以将第二个组设置为非捕获组。这是由
?:
完成的。因此,这一结果并未实现

((?:ab)*[0-9])

此项仅匹配
abababab9

编辑1:


下面是对正则表达式分组概念的解释:

您没有阅读
findall
文档:

返回字符串中所有非重叠匹配项的列表

如果模式中存在一个或多个捕获组,则返回组列表如果该模式已更改,则这将是一个元组列表 不止一组

结果中包含空匹配项

如果你看一下模块,捕获组是括在括号中的子模式,如
(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

您没有阅读
findall
文档:

返回字符串中所有非重叠匹配项的列表

如果模式中存在一个或多个捕获组,则返回组列表如果该模式已更改,则这将是一个元组列表 不止一组

结果中包含空匹配项

如果你看一下模块,捕获组是括在括号中的子模式,如
(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

您没有阅读
findall
文档:

返回字符串中所有非重叠匹配项的列表

如果模式中存在一个或多个捕获组,则返回组列表如果该模式已更改,则这将是一个元组列表 不止一组

结果中包含空匹配项

如果你看一下模块,捕获组是括在括号中的子模式,如
(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

您没有阅读
findall
文档:

返回字符串中所有非重叠匹配项的列表

如果模式中存在一个或多个捕获组,则返回组列表如果该模式已更改,则这将是一个元组列表 不止一组

结果中包含空匹配项

如果你看一下模块,捕获组是括在括号中的子模式,如
(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

组是什么意思?在
()
中使用的任何内容都会在组中从正则表达式匹配中捕获。在您的正则表达式中有两个
()
。何时是使用()parrenthesis的正确时间&何时应该使用(?:)?如果您不需要从匹配中捕获组,则使用
?:
。请检查此项。您所说的组是什么意思?您在
()
中使用的任何内容都将在组内从正则表达式匹配中捕获。在您的正则表达式中有两个
()
。何时是使用()parrenthesis的正确时间&何时应该使用(?)?如果您不需要从m捕获组