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

如何清理Python列表中提取零件号时混入的多余数字?

问题

我正在编写Python程序,遍历指定文件夹及其子文件夹,提取文件名中的零件号并存入列表。但列表里部分元素是['85670', '3']这种形式,不是预期的['85670']。试过转集合去重、移除空列表,都没解决。

代码

import os
import re

partNumbers = []
entries = (r'S:\WebDrawings\_Archive_&&&(Old WebDrawings Folder)&&&')
for subdir, dirs, files in os.walk(entries):
    for name in files:
        if name.startswith(("prnt", "prnt_")):
                partNumbertemp = re.findall('[0-9]+', name)
                partNumbers.append(partNumbertemp)    # 提取文件名中的数字段存入列表

while ([] in partNumbers):
        partNumbers.remove([])

print(partNumbers)

当前输出示例

['34010'], ['34011', '3'], ['34011'], ['34012', '3'], ['34012'], ['34013', '3'], ['34013'], ['34015', '3'], ['34015'], ['34016', '3'], ['34016'], ['34017', '3'], ['34017'], ['34018', '3'], ['34018'], ['33300', '3'], ['33300'], ['33301', '3'], ['33301'], ['33302', '3'], ['33302'], ['33303', '3'], ['33303'], ['33304', '3'], ['33304'], ['33305', '3'], ['33305'], ['47311'], ['89294'], ['89295'], ['87536'], ['88385'], ['88386'], ['88387'], ['87535'], ['88386'], ['87535'], ['03682'], ['03683'], ['36347'], ['37603'], ['53384'], ['34545'], ['85626'], ['85627'], ['85639'], ['85644'], ['85617'], ['85622'], ['85623'], ['85630'], ['85631'], ['85632'], ['85633'], ['85638'], ['85639'], ['85640'], ['85641'], ['85643'], ['85644'], ['85670'], ['85671'], ['85515'], ['85516'], ['85604'], ['85624'], ['85548'], ['85580'], ['85581'], ['85663'], ['85688'], ['85699'], ['85717'], ['85722'], ['86025'], ['83927910'], ['85705'], ['85539'], ['85582'], ['85649', '3'], ['85618'], ['85511', '3'], ['85512', '3'], ['85513', '3'], ['85543', '3'], ['85545', '3'], ['85546', '3'], ['85547', '3'], ['85548', '3'], ['85549', '3'], ['85550', '3'], ['85551', '3'], ['85552', '3'], ['85553', '3'], ['85554', '3'], ['85587', '3'], ['85588', '3'], ['85663', '3'], ['85678', '3'], ['85717', '3'], ['85722', '3'], ['85617', '3'], ['85622', '3'], ['85623', '3'], ['85624', '3'], ['85625', '3'], ['85626', '3'], ['85630', '3'], ['85631', '3'], ['85632', '3'], ['85633', '3'], ['85638', '3'], ['85640', '3'], ['85641', '3'], ['85643', '3'], ['85664', '3'], ['85665', '3'], ['85666', '3'], ['85670', '3'], ['85688', '3'], ['85705', '3'], ['86025', '3'], ['54403', '3'], ['54404', '3'], ['53272'], ['83340'], ['53261'], ['53261'], ['53261'], ['55017'], ['35481'], ['35482'], ['35483'], ['35484'], ['35485'], ['35486'], ['35487'], ['35488'], ['35489']

解决方案

问题根源是re.findall('[0-9]+', name)会匹配文件名里所有连续数字段,那些带'3'的元素,是因为文件名里除了零件号还有另一个单独的数字3(比如prnt_34011_3.pdf这类命名)。

针对性解决方法

根据零件号的特征选择对应方案:

  1. 如果零件号是文件名中最长的数字段:
    提取所有数字段后,筛选出长度最大的那个作为零件号:

    partNumbertemp = re.findall('[0-9]+', name)
    if partNumbertemp:
        # 取最长的数字串作为零件号
        target_part = max(partNumbertemp, key=len)
        partNumbers.append([target_part])
    
  2. 如果零件号紧跟在prnt或prnt_之后:
    用更精确的正则直接匹配目标数字段,避免无关数字干扰:

    match_result = re.search(r'prnt[_]?(\d+)', name)
    if match_result:
        partNumbers.append([match_result.group(1)])
    

代码优化建议

  • 原代码缺少os和re模块导入,运行会报错,需补充
  • 移除空列表的操作可以用列表推导式替代,更高效:
    partNumbers = [item for item in partNumbers if item]
    
  • 若需要对最终的零件号去重,可先展开嵌套列表再转集合:
    # 展开嵌套列表为一维列表
    all_parts = [part for sublist in partNumbers for part in sublist]
    # 去重
    unique_parts = list(set(all_parts))
    print(unique_parts)
    

内容的提问来源于Stack Exchange,提问作者Jaiven McIntosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:18:08