python中的Group regex

2024-04-26 14:41:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了一个简单的regex搜索来检查IPv6地址的有效性。我首先尝试了一个在4块系统中搜索简单十六进制字符的简单示例。你知道吗

例如:

The string - 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:']

尽管这个正则表达式在这个正则表达式测试网站上运行良好regexpal

为什么会这样?python不支持复杂regex的分组吗?你知道吗


Tags: there示例地址系统字符regexipv6
3条回答

您需要将编译行更改为:

r = re.compile("(?:[a-f]{4}:){3}[a-f]{4}")

当在regex中包含组时,regex函数(包括findall)返回组而不是整个匹配。在本例中,由于它匹配了3次,因此将返回最后一组匹配的结果,即第3个工件。你知道吗

?:添加到regex会导致成为非捕获组。这允许您将其分组以进行多次匹配,而不允许findall实际捕获它。因为现在没有捕获的组,findall将返回整个字符串。你知道吗

编辑:在Python2.6中似乎可以工作:

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

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

>>> r = re.compile(r"[a-f]{4}(?=:)|(?<=:)[a-f]{4}")
>>> s = "acbe:abfe:aaee:afec"
>>> r.findall(s)
['acbe', 'abfe', 'aaee', 'afec']

"[a-f]{4}:[a-f]{4}:[a-f]{4}:[a-f]{4}"中没有定义组,因此re.findall()返回它检测到的所有组0,也就是说entires匹配。你知道吗

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

?:放在组的开头部分之后,使其成为非捕获组,那么re.findall()仍然返回所有匹配项

相关问题 更多 >