如何用正则限制输入数字?IP地址段校验代码逻辑问题求助
修复IP地址校验函数的逻辑问题
原代码的核心问题是循环中过早使用return语句:只要第一个地址段满足≤255就直接返回True,后续的段完全没被校验,导致像64.128.256.512这种存在非法段的IP被误判为合法。
方法一:修正循环逻辑
调整判断逻辑,遍历所有地址段,只要发现任意一个段超过255就返回False,全部校验通过后再返回True:
import re def validate(ip): try: match = re.search(r"^(\d+)\.(\d+)\.(\d+)\.(\d+)$", ip.strip()) if not match: # 处理未匹配到四段格式的情况 return False for segment in match.groups(): if int(segment) > 255: return False return True # 所有段均合法才返回True except: return False # 测试示例 print(validate('64.128.256.512')) # 输出False print(validate('192.168.1.1')) # 输出True
方法二:用正则直接限制地址段范围(更高效)
可以直接在正则表达式中定义每个地址段的合法数值范围(0-255),匹配成功的IP必然符合要求,无需额外遍历判断:
import re def validate(ip): # 正则规则解析: # 25[0-5] → 匹配250-255 # 2[0-4]\d → 匹配200-249 # [01]?\d\d? → 匹配0-199(含单数字、双数字及带前导零的情况) pattern = r"^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$" return bool(re.fullmatch(pattern, ip.strip())) # 测试示例 print(validate('64.128.256.512')) # 输出False print(validate('192.168.1.1')) # 输出True print(validate('255.255.255.255')) # 输出True
注:如果业务需要允许带前导零的段(如
012.34.56.78),可以将正则简化为r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",再结合方法一的数值判断逻辑。
内容的提问来源于stack exchange,提问作者Payam
相关产品推荐
相关产品推荐

