鱼C论坛

 找回密码
 立即注册
查看: 1763|回复: 8

[已解决]python的正则表达式里的groups()函数

[复制链接]
发表于 2023-8-3 15:33:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m.group()
'abc'


为什么m.groups()会是('c',),不是很理解哦,m.groups(1)、m.groups(2)、m.groups(3)。。。。。。。。。m.groups(100)都是输出('c',),这是为什么?????


m.group()为啥又是输出'abc'

最佳答案
2023-8-3 15:43:09
非凡 发表于 2023-8-3 15:36
什么叫“因为只有括号中的  c  被捕获。”不是很理解

在正则表达式中,括号被用来定义"捕获组"。这意味着括号中的内容会被单独捕获并可以单独访问。在你的例子中,正则表达式是 "([abc])+",这意味着它会匹配一个或多个 'a'、'b' 或 'c'。

然而,当你使用 "+" 重复捕获组时,只有最后一个匹配的元素会被保留。在你的例子中,"abc" 都匹配了,但是由于 "+" 的存在,只有最后一个匹配的 'c' 被保留下来。这就是为什么 m.groups() 返回 ('c',) 的原因。


换句话说,"捕获"是指正则表达式匹配并保留特定子字符串的过程。在这种情况下,只有 'c' 被捕获,因为它是最后一个匹配的元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-3 15:34:07 | 显示全部楼层
m.groups()  方法返回一个包含所有捕获组内容的元组。在你的例子中,正则表达式 ([abc])+  匹配了整个字符串 "abc",但是只有最后一个括号内的子表达式被捕获。这就是为什么  m.groups()  返回了  ('c',) ,因为只有括号中的  c  被捕获。

如果你想要获取每个匹配的子组的内容,你可以使用  m.group(1) ,这将返回匹配的第一个子组的内容,即  'c' 。然而,在你的正则表达式中,由于捕获组被重复使用了,只有最后一个匹配被保留,所以  m.group(1) 、 m.group(2) 、 m.group(3) ... 都会返回  'c' 。

而  m.group()  返回整个匹配的内容,即  'abc' 。这不会受到捕获组重复使用的影响,所以它总是返回整个匹配的字符串。

希望这能帮助你理解这些方法的行为!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:34:07 | 显示全部楼层
在正则表达式中,括号()可以用于创建捕获组。当模式中包含一个或多个括号时,m.groups()会返回所有匹配的捕获组的元组。

在你提供的例子中,模式为([abc])+,表示匹配一个或多个连续出现的字符"a"、"b"或"c"。这里的括号([abc])是一个捕获组,它只能捕获一个字符,并且重复一次或多次,因为整个模式被修饰为+

当输入字符串为"abc"时,正则表达式会首先匹配整个字符串"abc",然后将最后一个字符"c"作为捕获组的内容。因此,m.groups()返回的结果是('c',),即一个包含唯一一个捕获组内容的元组。

m.group()返回的是整个匹配到的字符串"abc"。

关于 m.groups(1)m.groups(2)m.groups(3) ... m.groups(100) 的情况,groups() 方法不接受任何参数,它只返回所有捕获组的元组,即使传入了索引参数也不会改变返回值。如果您想访问特定的捕获组,请使用 m.group(group_number) 方法,其中 group_number 是所需捕获组的索引。

希望能解答清楚您的疑问。如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:34:07 | 显示全部楼层
在正则表达式中,括号表示一个捕获组(capturing group),可以用于匹配和提取特定的子字符串。当使用re.match()匹配成功后,m.groups()方法返回一个元组,其中包含每个捕获组匹配到的子字符串。如果没有捕获组,则返回一个空元组。

在你提供的示例中,正则表达式为"([abc])+",表示匹配一个或多个连续的字符"a"、"b"或"c"。由于括号是一个捕获组,它将匹配到的字符作为一个整体进行返回。

对于输入字符串"abc",匹配成功后的捕获组是:'a', 'b'和'c'。但是,在这个正则表达式中,只有最后一个捕获组会被保留,即'c'。因此,m.groups()返回的结果是一个包含单个元素'c'的元组:('c',)。

另一方面,m.group()方法返回整个匹配到的子字符串,即'abc'。

关于m.groups(1)m.groups(2)等的情况,实际上,groups()方法没有接受任何参数的形式。调用m.groups(1)等效于调用m.groups(),因此无论传入什么参数,结果都会是一样的。

希望这能够解答你的疑问。如果有任何进一步的问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-3 15:36:51 | 显示全部楼层
isdkz 发表于 2023-8-3 15:34
m.groups()  方法返回一个包含所有捕获组内容的元组。在你的例子中,正则表达式 ([abc])+  匹配了整个字符 ...

什么叫“因为只有括号中的  c  被捕获。”不是很理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:43:09 | 显示全部楼层    本楼为最佳答案   
非凡 发表于 2023-8-3 15:36
什么叫“因为只有括号中的  c  被捕获。”不是很理解

在正则表达式中,括号被用来定义"捕获组"。这意味着括号中的内容会被单独捕获并可以单独访问。在你的例子中,正则表达式是 "([abc])+",这意味着它会匹配一个或多个 'a'、'b' 或 'c'。

然而,当你使用 "+" 重复捕获组时,只有最后一个匹配的元素会被保留。在你的例子中,"abc" 都匹配了,但是由于 "+" 的存在,只有最后一个匹配的 'c' 被保留下来。这就是为什么 m.groups() 返回 ('c',) 的原因。


换句话说,"捕获"是指正则表达式匹配并保留特定子字符串的过程。在这种情况下,只有 'c' 被捕获,因为它是最后一个匹配的元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:49:40 | 显示全部楼层
你可以对比一下这两个代码的区别:

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m.group()
'abc'



>>> m = re.match("([abc]+)", "abc")
>>> m.groups()
('abc',)
>>> m.group()
'abc'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 16:00:55 | 显示全部楼层
isdkz 发表于 2023-8-3 15:49
你可以对比一下这两个代码的区别:

>>> m = re.match("([abc])+", "abc")

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-3 16:17:38 | 显示全部楼层
isdkz 发表于 2023-8-3 15:49
你可以对比一下这两个代码的区别:

>>> m = re.match("([abc])+", "abc")

感谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表