Python用正则提取文件名6位数字报列表索引超出范围求助
优化方案
报错原因
你遇到的IndexError是因为部分文件名按下划线拆分后的元素总数不足4个,访问split('_')[3]时自然触发索引越界。而硬编码下划线拆分后的索引来提取目标数字的方式本身存在逻辑缺陷,只要6位数字出现在你未覆盖的位置就会提取失败,且无法适配所有无固定命名规则的场景。
最优改进逻辑
直接通过正则匹配提取目标6位数字,不需要拆分文件名后硬取索引,适配所有位置的场景,代码如下:
import re # 正则含义:匹配前后为下划线/字符串首尾的独立6位纯数字,避免提取到和字母/其他字符连在一起的6位数字 target_pattern = re.compile(r'(?<=^|_)\d{6}(?=_|$)') file_series = new_df_meta['file'] extracted_nums = [] for filename in file_series: res = target_pattern.search(filename) if res: extracted_nums.append(res.group())
优化点说明
- 完全规避索引越界问题,无论目标6位数字出现在文件名的哪个下划线分隔位置,都可以准确提取
- 正则的前后断言规则完美适配你「下划线作为分隔符」的共性规则,不会误提取类似
SI544015中与字母拼接的544015这类无效值 - 代码逻辑大幅简化,执行效率远高于原方案中拆分后取多个索引再合并的操作
特殊场景兼容
如果存在部分目标6位数字前后不是下划线的特殊情况,且你确认每个文件名仅存在1个符合要求的6位数字,可以直接简化正则提取所有6位数字后再根据业务规则过滤:
simple_pattern = re.compile(r'\d{6}') extracted_nums = [] for filename in new_df_meta['file']: matches = simple_pattern.findall(filename) if matches: # 可根据业务规则在matches中筛选正确的目标值,比如取长度正好为6、无前后缀的结果 extracted_nums.append(matches[0])
内容的提问来源于stack exchange,提问作者Lucas Anthony
相关产品推荐
相关产品推荐

