一、问题起源:
需求:从文本中寻找所有的IP地址;
假设文本字符串:test = “xxx123.3.2.3abd 23.2.3.3”
IP正则表达式:((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
直接使用re.findall(pattern, test)没有输出预期结果,如图所示:
二、寻找答案
1、定位正则表达的正确与否
使用search与match均能输出正确的结果
结论:1、match一定是起始处开始匹配,search可以从任意位置进行匹配;正则表达式是正确的
2、当把括号全部展开时, 会怎么样
结论:没有括号时是可以找出所有的IP
3、findall与小括号有什么关系呢
百度搜索得到如下结论:
发现findall在正则表达式有括号和没有括号的情况下,结果不同
在正则表达式有一个括号的时候,仅仅匹配括号内的内容
当有两个括号时,它会分别匹配括号由内向外的内容,经结果存在元组中再给列表
找到一个解决办法,用(?:re)的方法来去除组
结论:原来findall匹配的时候会仅仅返回括号内的内容
三、正确的答案
使用?:忽略括号内的匹配