如何从字符串中提取所有符合规则的IP地址?含多段串提取示例
提取重叠连续IP段的解决方案
核心思路
要从连续点分隔的数字串里提取所有重叠的4段IP格式字符串,关键是让正则引擎不消耗匹配过的字符,这样才能捕获到重叠结果,用正向预查(零宽断言)就能实现。
基础实现(仅提取4段数字组合)
如果只需要提取连续4段数字(不验证IP合法性),可以用以下正则和代码:
import re target_str = "1.2.3.4.5.6.7" # 正向预查捕获4段数字组合,不消耗字符以支持重叠匹配 regex_pattern = r'(?=(\d+\.\d+\.\d+\.\d+))' result = re.findall(regex_pattern, target_str) print(result) # 输出:['1.2.3.4', '2.3.4.5', '3.4.5.6', '4.5.6.7']
严格IP合法性验证
如果需要确保提取的是合法IPv4地址(每个段在0-255之间),把正则里的\d+替换成IP段的合法匹配规则即可:
import re target_str = "1.2.3.4.5.6.7" # 匹配合法IP段的正则单元 ip_segment = r'(25[0-5]|2[0-4]\d|[01]?\d\d?)' # 组合成完整的正向预查正则 regex_pattern = fr'(?=({ip_segment}\.{ip_segment}\.{ip_segment}\.{ip_segment}))' result = re.findall(regex_pattern, target_str) print(result) # 输出:['1.2.3.4', '2.3.4.5', '3.4.5.6', '4.5.6.7']
原理说明
(?=...)是正向预查断言,它只检查当前位置后面是否符合匹配规则,但不会移动正则引擎的匹配指针,所以匹配完"1.2.3.4"后,引擎会从第二个字符(也就是"2"前面的位置)继续匹配,从而捕获到所有重叠的4段组合。
内容的提问来源于stack exchange,提问作者Saurabh Chauhan
相关产品推荐
相关产品推荐

