调用re.pattern.search提取日志IP时报NoneType不可下标错误如何解决
问题排查结果
报错根因
- 直接触发
TypeError: 'NoneType' object is not subscriptable的原因:re.search()在当前行没有匹配到符合正则规则的IP时,会返回None,直接对None执行[0]取下标操作不符合语法规则。 - 代码还存在两处额外问题:
- 变量名不一致:你初始化的空列表叫
list,但循环中实际往lst里追加元素,运行时会触发未定义变量报错 - 命名不规范:
list是Python内置类型名,用作自定义变量名会覆盖原生list的功能,不建议这么用
- 变量名不一致:你初始化的空列表叫
修复后可运行代码
import re with open(r'C:\Users\Admin\Desktop/Test error file.txt') as fh: file_lines = fh.readlines() # 基础IP匹配正则,如需更严格的合法性校验可以替换下方正则 pattern = re.compile(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})') ip_list = [] for line in file_lines: match_result = pattern.search(line) # 仅在匹配到结果时才取值存入列表 if match_result: ip_list.append(match_result[0]) print(ip_list)
可选优化
如果需要过滤999.999.999.999这类不符合IP地址规则的非法匹配结果,可以把正则替换为:r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
内容的提问来源于stack exchange,提问作者CodeSteak
相关产品推荐
相关产品推荐

