findall的括号问题

import re
s = '1213134 12121212asadqwqw192.168.1.1asadafa asqw'
p1 = r'((2[0-4]\d|25[0-5]|1\d{2}|\d{1,2})\.){3}(2[0-4]\d|25[0-5]|1\d{2}|\d{1,2})'
List = re.search(p1,s)
List2 = re.findall(p1,s)
print(List,"\n",List2)

会发现search和findall的结果不一样

<re.Match object; span=(24, 35), match='192.168.1.1'> 
 [('1.', '1', '1')]

这是因为findall遇到括号会提取括号中的数据,如果遇到多个括号则把多个括号中的内容组成元组输出,所以需要使用 ?: 来声明括号不做分组使用

所以正确的能被findall匹配IP地址的正则应该这么写
(?:(?:2[0-4]\d|25[0-5]|1\d{2}|\d{1,2})\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|\d{1,2})
posted on 2019-12-18 16:31  盈盈的月儿  阅读(540)  评论(0编辑  收藏  举报