我尝试了一个简单的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的分组吗?你知道吗
您需要将编译行更改为:
当在regex中包含组时,regex函数(包括findall)返回组而不是整个匹配。在本例中,由于它匹配了3次,因此将返回最后一组匹配的结果,即第3个工件。你知道吗
将
?:
添加到regex会导致成为非捕获组。这允许您将其分组以进行多次匹配,而不允许findall实际捕获它。因为现在没有捕获的组,findall将返回整个字符串。你知道吗编辑:在Python2.6中似乎可以工作:
我猜你是想得到每一个四个字母的字符串?你想让
findall
返回['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()
仍然返回所有匹配项相关问题 更多 >
编程相关推荐