You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:45:31