Python正则匹配文件名1-2位整数提取数值时触发NoneType报错
问题描述
- 核心需求:从文件名中提取1位或2位整数形式的电压信息,同时兼容两种长度数字的提取场景
- 现有逻辑缺陷:原实现通过遍历正则规则列表,匹配文件名中带
L/GL后缀的数字片段时,匹配到2位数字(如_16GL)可正常计算(提取到的数字作为电压值,电压值减1得到最大电压);但匹配1位数字(如_8GL)时,因后续硬编码使用仅适配两位数字的正则做二次检索,触发NoneType error: object has no attribute 'group'报错,无法同时适配两种长度的数字提取。
修复方案
核心思路是放弃分长度写死正则、二次检索的逻辑,直接用支持长度区间的正则一次完成匹配,同时增加匹配结果非空判断,从根源避免空值报错。
适配正则
直接使用以下正则即可同时覆盖1位/2位数字、L/GL后缀的所有匹配场景:
_(\d{1,2})(?:G?L)
正则规则说明:
_:匹配数字前的下划线分隔符,避免匹配文件名中其他位置的零散数字(\d{1,2}):捕获组,提取1位或2位连续数字,即为目标电压值(?:G?L):非捕获组,匹配后缀部分,G?表示G字符可出现0次或1次,刚好覆盖L/GL两种后缀,不会把后缀内容混入提取结果
修正后代码示例
替换原有分长度匹配的逻辑,单次匹配即可拿到结果,增加空匹配兜底:
import re import os def extract_voltage(file_path): file_name = os.path.basename(file_path) # 单次正则匹配覆盖所有场景,无需分支判断 match_result = re.search(r'_(\d{1,2})(?:G?L)', file_name) if not match_result: raise ValueError(f"文件名{file_name}中未找到符合格式的电压标识") voltage = int(match_result.group(1)) max_voltage = voltage - 1 return voltage, max_voltage # 测试用例 test_file_list = [ "/log/power_16GL_20240601.csv", "/log/signal_8GL_20240602.csv", "/log/volt_5L_20240603.csv", "/log/sys_12L_20240604.csv" ] for file in test_file_list: v, max_v = extract_voltage(file) print(f"文件名:{os.path.basename(file)},提取电压:{v}V,最大电压:{max_v}V")
运行验证结果
执行上述代码可得到符合预期的输出,无报错:
文件名:power_16GL_20240601.csv,提取电压:16V,最大电压:15V 文件名:signal_8GL_20240602.csv,提取电压:8V,最大电压:7V 文件名:volt_5L_20240603.csv,提取电压:5V,最大电压:4V 文件名:sys_12L_20240604.csv,提取电压:12V,最大电压:11V
注意事项
- 数字长度匹配直接用
{m,n}区间语法即可覆盖多长度场景,无需编写多套正则做二选一判断 - 所有正则匹配结果必须先做非空判断再调用
group()方法取值,从根源避免NoneType类报错 - 后缀匹配用可选字符符
?实现多后缀兼容,比写分支正则更简洁,匹配效率更高
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

