正则表达式匹配IP地址范围中的第二个有效IP地址
解决方案
你的问题出在两个核心问题上:
- 原正则的正向断言
(?<=\-\s))存在语法错误(多了一个右括号),且仅能匹配-后跟单个空格的场景,无法覆盖-前后无空格、多个空格的情况; - 没有验证IP地址的有效性,只是简单匹配数字段,会导致捕获到
1.0.0.2456这类无效IP。
正确的正则实现方案
我们先定义有效IP地址的正则片段,再匹配-前后任意数量的空格,最终精准捕获第二个有效IP:
import re test = ''' 1.0.0.0-1.0.0.240 2.0.0.0 - 1.0.0.241 3.0.0.0 -1.0.0.242 4.0.0.0- 1.0.0.243 5.0.0.0 - 1.0.0.244 6.0.0.0 - 1.0.0.245 7.0.0.0 - 1.0.0.2456 #NOT VALID SO DONT MATCH ''' # 定义匹配0-255合法数字段的正则 valid_ip_segment = r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' # 拼接成完整的有效IP正则 valid_ip = rf'{valid_ip_segment}\.{valid_ip_segment}\.{valid_ip_segment}\.{valid_ip_segment}' # 匹配每行中,-前后任意空格后的有效IP pattern = rf'^.*?\s*-\s*({valid_ip})$' r = re.compile(pattern, re.MULTILINE) matches = r.findall(test) print(matches) # 输出结果: ['1.0.0.240', '1.0.0.241', '1.0.0.242', '1.0.0.243', '1.0.0.244', '1.0.0.245']
代码说明
- 有效IP校验:
valid_ip_segment确保每个IP段是0-255之间的合法数值,直接过滤掉超出范围的无效段; - 多行模式适配:
re.MULTILINE让^和$分别匹配每行的开头和结尾,保证只处理单行内的IP范围; - 分隔符兼容:
\s*-\s*匹配-前后任意数量的空格(包括0个),覆盖所有可能的分隔写法; - 精准捕获:通过括号捕获第二个符合规则的有效IP,无效IP所在的行会因不满足
valid_ip规则被自动过滤。
内容的提问来源于stack exchange,提问作者suzkirch
相关产品推荐
相关产品推荐

