python中的组正则表达式

python中的组正则表达式,python,regex,Python,Regex,我正在尝试一个简单的正则表达式搜索来检查IPv6地址的有效性。我首先尝试了一个在4块系统中搜索简单十六进制字符的简单示例 例如: 字符串-acbe:abfe:aaee:afec 我首先使用了下面的正则表达式,它工作得很好: Python 2.7.3 (default, Sep 26 2013, 20:03:06) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information

我正在尝试一个简单的正则表达式搜索来检查IPv6地址的有效性。我首先尝试了一个在4块系统中搜索简单十六进制字符的简单示例

例如:

字符串-acbe:abfe:aaee:afec

我首先使用了下面的正则表达式,它工作得很好:

Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r = re.compile("[a-f]{4}:[a-f]{4}:[a-f]{4}:[a-f]{4}")
>>> s = "acbe:abfe:aaee:afec"
>>> r.findall(s)
['acbe:abfe:aaee:afec']
然后我尝试了一个不同的正则表达式,因为它在重复:

>>> r = re.compile("([a-f]{4}:){3}[a-f]{4}")
>>> r.findall(s)
['aaee:']
尽管这个正则表达式在这个正则表达式测试网站上运行良好


为什么会这样?python不支持复杂正则表达式的分组吗?

您需要将编译行更改为:

r = re.compile("(?:[a-f]{4}:){3}[a-f]{4}")
如果在正则表达式中包含组,则正则表达式函数(包括findall)将返回组,而不是整个匹配。在这种情况下,由于它匹配了3次,因此将返回最后一组匹配的结果,即第3块

将?:添加到正则表达式会导致成为非捕获组。这允许您将其分组以进行多个匹配,而不允许findall实际捕获它。由于现在没有捕获的组,findall将返回整个字符串

编辑:在python 2.6中,它似乎可以工作:

s = "acbe:abfe:aaee:afec"
r.findall(s)
['acbe:abfe:aaee:afec']

您需要将编译行更改为:

r = re.compile("(?:[a-f]{4}:){3}[a-f]{4}")
如果在正则表达式中包含组,则正则表达式函数(包括findall)将返回组,而不是整个匹配。在这种情况下,由于它匹配了3次,因此将返回最后一组匹配的结果,即第3块

将?:添加到正则表达式会导致成为非捕获组。这允许您将其分组以进行多个匹配,而不允许findall实际捕获它。由于现在没有捕获的组,findall将返回整个字符串

编辑:在python 2.6中,它似乎可以工作:

s = "acbe:abfe:aaee:afec"
r.findall(s)
['acbe:abfe:aaee:afec']

我想你是想得到每个四个字母的字符串?你想让findall返回['acbe','abfe','aaee','afec']


我想你是想得到每个四个字母的字符串?你想让findall返回['acbe','abfe','aaee','afec']

在[a-f]{4}:[a-f]{4}:[a-f]{4}:[a-f]{4}中没有定义组,因此re.findall返回它检测到的所有组0,即实体匹配

在[a-f]{4}:{3}[a-f]{4}中定义了一个组,re.findall返回与该组对应的所有匹配部分。但是,当重复该组时,只返回该组在每个总匹配中的最后一次出现

Puting?:在组的开始部分使其成为非捕获组之后,re.findall仍然返回[a-f]{4}:[a-f]{4}:[a-f]{4}:[a-f]{4}:[a-f]{4}中的所有匹配项

。没有定义组,因此re.findall返回它检测到的所有组0,也就是整个匹配项

在[a-f]{4}:{3}[a-f]{4}中定义了一个组,re.findall返回与该组对应的所有匹配部分。但是,当重复该组时,只返回该组在每个总匹配中的最后一次出现



Puting?:在组的开始部分使其成为非捕获组之后,re.findall仍然返回所有匹配项

您希望输出什么?它应该匹配整个字符串如果我没记错的话,对于python,如果您希望匹配组,以便组内容本身不会被捕获,这似乎是正在发生的事情?您必须使用?:。。。而不是您希望输出什么?它应该匹配整个字符串如果我没记错的话,对于python,如果您希望匹配组,这样组内容本身就不会被捕获,这似乎是正在发生的事情?您必须使用?:。。。而不是哎哟,那是我的否决票,我误解了OP的意图,现在取消我的投票已经太迟了!是否只有在使用括号指定组时才会发生这种情况?所以,它使整个正则表达式成为一个大的组,对吗?是括号定义了组。。。括号/大括号不会导致这种行为。对不起,我的意思是括号:是。。我以前被这个咬过。无论何时为组添加括号,都会更改行为,除非同时添加?:。在某些情况下,您可能实际上希望从一个字符串中提取多条信息;小组让你这样做。但是如果你不想这么做,你想用?:。哎哟,那是我的反对票,我误解了OP的意图,现在取消我的投票已经太晚了!是否只有在使用括号指定组时才会发生这种情况?所以,它使整个正则表达式成为一个大的组,对吗?是括号定义了组。。。括号/大括号不会导致这种行为。对不起,我的意思是括号:是。。我以前被这个咬过。无论何时为组添加括号,都会更改行为,除非同时添加?:。在某些情况下,您可能实际上希望从一个字符串中提取多条信息;小组让你这样做。但是如果你不想这么做,你想用?:。只有当我用括号来表示
指定一个组?所以,它使整个正则表达式成为一个大的组,对吗?句子中的这是什么?只有当我使用括号时才会发生…?-在re.findall的文档中写到:如果模式中存在一个或多个组,则返回一个组列表;如果模式有多个组,这将是一个元组列表。您所说的定义了一个组是什么意思,您指的是括号内的部分,对吗?由于重复了该操作,因此只返回最后一个组?事实上,整个匹配始终是group0 aka group,或者有paren,或者没有paren。当有参数时,re.findall返回与group0不同的所有组,当没有参数时,re.findall返回entires matches=group0Yes,组由两个括号定义:。。。。。定义捕获组。?:。。。。。定义一个非捕获组。请注意,根据wikipedia:Used unqualified,括号指世界不同地区和不同上下文中不同类型的括号。和是圆括号,{和}是花括号,[和]是尖括号。只有当我使用括号指定组时才会发生这种情况吗?所以,它使整个正则表达式成为一个大的组,对吗?句子中的这是什么?只有当我使用括号时才会发生…?-在re.findall的文档中写到:如果模式中存在一个或多个组,则返回一个组列表;如果模式有多个组,这将是一个元组列表。您所说的定义了一个组是什么意思,您指的是括号内的部分,对吗?由于重复了该操作,因此只返回最后一个组?事实上,整个匹配始终是group0 aka group,或者有paren,或者没有paren。当有参数时,re.findall返回与group0不同的所有组,当没有参数时,re.findall返回entires matches=group0Yes,组由两个括号定义:。。。。。定义捕获组。?:。。。。。定义一个非捕获组。请注意,根据wikipedia:Used unqualified,括号指世界不同地区和不同上下文中不同类型的括号。和是圆括号,{和}是花括号,[和]是尖括号。