如何用Python正则表达式匹配合法IP并排除无效格式?
解决IP地址正则匹配的无效匹配问题
你的原正则表达式[0-999]*.[0-999]*.[0-999]*.[0-999]*存在几个关键问题,导致会错误匹配无效IP的部分片段:
- 字符集
[0-999]完全错误:正则的字符集只能定义单个字符的范围,这里实际等价于[0-9],根本没法限定0-255的数值范围 - 未转义
.:正则里的.是通配符,会匹配任意字符,不是你想要的IP中的点号,必须转义成\. - 缺少边界限制:没有用
^(字符串开头)和$(字符串结尾)锚定,导致会匹配长字符串里的部分内容,比如2.2.3.3.3的前四段 - 量词
*不合理:允许IP段为空,会匹配..1.1这类完全非法的格式
要准确匹配合法IP且排除无效格式,你需要用带边界锚定、能正确限定0-255数值范围的正则:
^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$
正则说明:
^和$:锚定整个字符串的开头和结尾,确保只匹配完整的四段IP,不会匹配长字符串里的片段- 每个IP段的匹配规则
(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d):25[0-5]:匹配250-2552[0-4]\d:匹配200-2491\d{2}:匹配100-199[1-9]\d:匹配10-99(避免出现01这种带前导零的非法段)\d:匹配0-9
(?:...)\.{3}:重复三次“合法段+点号”的组合,最后再加上一个合法段,刚好组成四段IP
用这个正则测试你的数据:
- 能正确匹配
10.37.255.1、1.1.1.10 - 会直接拒绝
2.2.3.3.3这类超过四段的无效IP,同时也能排除256.1.1.1、01.1.1.1等非法格式
内容的提问来源于stack exchange,提问作者PChao
相关产品推荐
相关产品推荐

