如何清理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这类命名)。
针对性解决方法
根据零件号的特征选择对应方案:
如果零件号是文件名中最长的数字段:
提取所有数字段后,筛选出长度最大的那个作为零件号:partNumbertemp = re.findall('[0-9]+', name) if partNumbertemp: # 取最长的数字串作为零件号 target_part = max(partNumbertemp, key=len) partNumbers.append([target_part])如果零件号紧跟在
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
相关产品推荐
相关产品推荐

