正则表达式中group和groups的区别

第一点,搞清楚它们用在什么地方?

正则表达式中,group()用来提取分组截获的字符串,()用来分组。

组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思;它们一起把在它们里面的表达式组成一组。举个例子,你可以用重复限制符,象 *, +, ?, 和 {m,n},来重复组里的内容,比如说(ab)* 将匹配零或更多个重复的 "ab"。

如果不引入括号,整个个表达式作为一个组,是group(0)(特别要注意这个,属于易混点)

第二点 谈区别

group和groups是两个不同的函数。

一般,m.group(N) 返回第N组括号匹配的字符。
而m.group() == m.group(0) == 所有匹配的字符,与括号无关,这个是API规定的。

m.groups() 返回所有括号匹配的字符,以tuple格式(元组格式),不包括m.group(0),即整个表达式。
m.groups() == (m.group(0), m.group(1), ...)

第三点 实例说明

例一:未加括号时,默认分组为整个表达式

>>> import re

>>> p=re.compile('\d-\d-\d')

>>> m=p.match('2-3-1')

>>> m.groups()

()

>>> m.group()

'2-3-1'

>>> m.group(0)

'2-3-1'

>>> m.group(1)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

IndexError: no such group

例二: 分组之后的情形

>>> p=re.compile('(\d)-(\d)-(\d)')

>>> m.groups()

()

>>> m=p.match('2-3-1')

>>> m.groups()

('2', '3', '1')

>>> m.group()

'2-3-1'

>>> m.group(0)

'2-3-1'

>>> m.group(1)

'2'

>>> m.group(2)

'3'

>>> m.group(3)

'1'

>>> m.group(4)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

IndexError: no such group

>>> m.groups()

('2', '3', '1')

注意:m.groups()不包含自身的表达式。

猜你喜欢

转载自blog.csdn.net/Thoms_/article/details/81475968