鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 7

[已解决]正则表达式的groups以及非捕获组

[复制链接]
发表于 2020-6-27 11:59:12 | 显示全部楼层 |阅读模式

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

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

x
求指教下面代码的输出结果:
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:[abc])+", "abc")
>>> m.groups()
()
第一个的输出结果为什么不是('a','b','c')?
第二个是因为加了非捕获组 所以捕获不到然后变成空的了吗?求大佬指点
最佳答案
2020-6-27 12:51:04
今天的我更强了 发表于 2020-6-27 12:39
([abc])+ 在这里不是应该相当于([abc])([abc])([abc]) 就是有三个子组吗?

这样是要在开启非贪婪模式的前提下
贪婪模式会一直往后匹配,直到条件不符合,但是“abc”这个字符串每一个字符全符合
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-27 12:07:03 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-6-27 12:11 编辑

第一个的输出结果为什么不是('a','b','c')?
因为你之后多加了一个 “+” 所以正则会匹配一个以上的字符(就是贪婪模式)
把加号去掉就行了
  1. re.match("([abc])", "abc")
复制代码
或是说将他编变成非贪婪模式(加一个“?”)
  1. re.match("([abc])+?", "abc")
复制代码


第二个是因为加了非捕获组 所以捕获不到然后变成空的了吗?
对呀

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

使用道具 举报

 楼主| 发表于 2020-6-27 12:39:52 | 显示全部楼层
liuzhengyuan 发表于 2020-6-27 12:07
因为你之后多加了一个 “+” 所以正则会匹配一个以上的字符(就是贪婪模式)
把加号去掉就行了
或是说将 ...

([abc])+ 在这里不是应该相当于([abc])([abc])([abc]) 就是有三个子组吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 12:51:04 | 显示全部楼层    本楼为最佳答案   
今天的我更强了 发表于 2020-6-27 12:39
([abc])+ 在这里不是应该相当于([abc])([abc])([abc]) 就是有三个子组吗?

这样是要在开启非贪婪模式的前提下
贪婪模式会一直往后匹配,直到条件不符合,但是“abc”这个字符串每一个字符全符合
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 13:23:05 | 显示全部楼层
liuzhengyuan 发表于 2020-6-27 12:51
这样是要在开启非贪婪模式的前提下
贪婪模式会一直往后匹配,直到条件不符合,但是“abc”这个字符串每 ...

可能是我问题描述的不准确,我再精炼一下,groups()返回的不应该是所有的子组嘛?贪婪模式是尽可能多的去匹配,所以abc三个都能匹配到,所以应该有三个子组,那groups()返回的不应该是包含三个子组?为什么只有一个c,求大佬指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 13:23:10 | 显示全部楼层


我觉得是这样的:

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


括号默认是捕获组,而你在括号后面 + 是表示将括号里面的内容进行多次匹配({3},*,+都是如此),而不等价于 ([abc])([abc])([abc])

而你想匹配到 ('a','b','c') 就必须写完整:
  1. import re
  2. m = re.match("([abc])([abc])([abc])", "abc")
  3. print(m.groups())
复制代码

第二个是因为加了非捕获组 所以捕获不到然后变成空的了吗?


第二个是非捕获组,而非捕获组只匹配结果,但不捕获结果,也不会分配组号,所以就为()空。

  1. >>> m.group()
  2. a
  3. >>> m.groups()
  4. ()
复制代码


我也不太清楚这些.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 13:30:28 | 显示全部楼层
今天的我更强了 发表于 2020-6-27 13:23
可能是我问题描述的不准确,我再精炼一下,groups()返回的不应该是所有的子组嘛?贪婪模式是尽可能多的去 ...

这是因为 “+” 在小括号外面,放在里面就对了,放在外面的话只能匹配一个,因为 “+” 不包含在要匹配的字符串的范围内
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 14:06:09 | 显示全部楼层
第一个就可以理解为贪婪匹配不复制组,相当于[abc][abc]([abc]),所以只有一个组,那就是最后一次匹配到的c
第二个你取消组肯定就没有组了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 15:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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