Python正则表达式中的groups()方法

Python正则表达式中的groups()方法,python,regex,Python,Regex,我正在学习Python中的regex,在理解函数groups()时遇到问题 在这里,我定义了类[abc],我知道,它意味着从a到c的任何字符。它是在一个组中定义的,+符号表示我们至少需要一个这样的组。因此,我执行以下行,结果是可以理解的: >>> m.group() 'abc' >>> m.group(0) 'abc' 我明白为什么会这样。主组的索引为0,“abc”与我们定义的类匹配。到目前为止还不错,但我不明白为什么以下几行会以这种方式执行: >&g

我正在学习Python中的regex,在理解函数
groups()
时遇到问题

在这里,我定义了类[abc],我知道,它意味着从a到c的任何字符。它是在一个组中定义的,+符号表示我们至少需要一个这样的组。因此,我执行以下行,结果是可以理解的:

>>> m.group()
'abc'
>>> m.group(0)
'abc'
我明白为什么会这样。主组的索引为0,“abc”与我们定义的类匹配。到目前为止还不错,但我不明白为什么以下几行会以这种方式执行:

>>> m.group(1)
'c'
>>> m.groups()
('c',)
什么是组(1),我在这里只定义了一个组,为什么groups函数中只有字符“c”?它不是应该返回一个包含所有组的元组吗?我想它至少会包含“abc”。

来自:

如果组匹配多次,则只能访问最后一个匹配:

您的组只能匹配一个字符,因此
c
是最后一个匹配

您提到您希望至少看到
'abc'
-如果您希望您的组匹配多个字符,请将
+
放在组内:

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

有关
re
的详细信息,请咨询。就你而言:

group(0)
代表所有匹配的字符串,因此
abc
,即3组
a
b
c

group(i)
代表第i组,并引用文档

如果组匹配多次,则只能访问最后一个匹配

因此,
group(1)
代表最后一个匹配,
c

您的
+
被解释为组重复,如果您想在组内重复
[abc]
,请将
+
移动到括号中:

>>> re.match("([abc])", "abc").groups()
('a',)
>>> re.match("([abc]+)", "abc").groups()
('abc',)

这是最指定的regexp,按组你可以看到协议,文件名我忘了文件-ext

["](?P<protocol>http(?P<secure>s)?://)(?P<fqdn>[a-zA-Z0-9]*(?P<subdomain>(.)[a-zA-Z0-9]*)*)[/](?P<filename>([a-zA-Z.])*)["]
[”](?Phttp(?Ps):/)(?P[a-zA-Z0-9]*(?P()[a-zA-Z0-9]*)[/)(?P([a-zA-Z]*))*)[“]
我删除了响应,因为我是


如果是这种情况,为什么在本例中groups()函数将所有组存储在一个元组中:
>p=re.compile('(a(b)c)d')
>m=p.match('abcd')
>m.group(2,1,2)
('b','abc','b')
该示例创建了两个不同的组,这与一组多次匹配的
+
*
重复不同。这个答案非常混乱,很难理解。我尝试以这种方式使用组,在第一次词法分析中,您将能够获得多个项目,例如:这是协议的名称,可以是http或https。。。返回您的主机名…啊。。。我懂了。现在我更明白了
>>> re.match("([abc])", "abc").groups()
('a',)
>>> re.match("([abc]+)", "abc").groups()
('abc',)
["](?P<protocol>http(?P<secure>s)?://)(?P<fqdn>[a-zA-Z0-9]*(?P<subdomain>(.)[a-zA-Z0-9]*)*)[/](?P<filename>([a-zA-Z.])*)["]