今天的我更强了 发表于 2020-6-27 11:59:12

正则表达式的groups以及非捕获组

求指教下面代码的输出结果:
>>> m = re.match("()+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:)+", "abc")
>>> m.groups()
()
第一个的输出结果为什么不是('a','b','c')?
第二个是因为加了非捕获组 所以捕获不到然后变成空的了吗?求大佬指点

liuzhengyuan 发表于 2020-6-27 12:07:03

本帖最后由 liuzhengyuan 于 2020-6-27 12:11 编辑

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


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

今天的我更强了 发表于 2020-6-27 12:39:52

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

()+ 在这里不是应该相当于()()() 就是有三个子组吗?

liuzhengyuan 发表于 2020-6-27 12:51:04

今天的我更强了 发表于 2020-6-27 12:39
()+ 在这里不是应该相当于()()() 就是有三个子组吗?

这样是要在开启非贪婪模式的前提下
贪婪模式会一直往后匹配,直到条件不符合,但是“abc”这个字符串每一个字符全符合

今天的我更强了 发表于 2020-6-27 13:23:05

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

可能是我问题描述的不准确,我再精炼一下,groups()返回的不应该是所有的子组嘛?贪婪模式是尽可能多的去匹配,所以abc三个都能匹配到,所以应该有三个子组,那groups()返回的不应该是包含三个子组?为什么只有一个c,求大佬指教{:10_266:}

Twilight6 发表于 2020-6-27 13:23:10



我觉得是这样的:

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

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

而你想匹配到 ('a','b','c') 就必须写完整:
import re
m = re.match("()()()", "abc")
print(m.groups())

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

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

>>> m.group()
a
>>> m.groups()
()

我也不太清楚这些.....

liuzhengyuan 发表于 2020-6-27 13:30:28

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

这是因为 “+” 在小括号外面,放在里面就对了,放在外面的话只能匹配一个,因为 “+” 不包含在要匹配的字符串的范围内

天道无子 发表于 2020-6-27 14:06:09

第一个就可以理解为贪婪匹配不复制组,相当于(),所以只有一个组,那就是最后一次匹配到的c
第二个你取消组肯定就没有组了
页: [1]
查看完整版本: 正则表达式的groups以及非捕获组