Python正则匹配文件名到字典失败求助:文件与字符串列表匹配问题
解决Python脚本匹配文件名到字典的问题
我来帮你排查下脚本没匹配到内容的原因,核心问题出在正则匹配逻辑和字典键的匹配逻辑不匹配,咱们一步步修正:
问题分析
正则匹配方向错误
你原来用(.*)_R1提取的是_R1前面的整个长前缀(比如ABC的R1文件会拿到DB_ABC_2_T_bR_r1_v1_0_S1),但你的字典键是ABC/DEF,这两个字符串完全不相等,自然永远匹配不上。你需要从文件名里提取出ABC/DEF这类目标标识,而不是整个前缀。字典初始化冗余
你同时初始化了samp1和samp2两个字典,但最终预期输出是一个字典,每个键对应R1+R2的文件列表,完全没必要搞两个字典,反而增加复杂度。文件判断逻辑重复
分别判断R1和R2的正则属于重复操作,而且没关联到字典的键,导致匹配逻辑断裂。
修正后的脚本
下面是调整后的代码,完全符合你的预期输出:
import os import re # 注意:不要用dir当变量名,这是Python内置函数 target_dir = '/user/home/files' list_file = '/user/home/list' # 初始化结果字典,每个键对应空列表 sample_files = {} # 读取列表文件,填充字典的键 with open(list_file, 'r') as fh: for line in fh: key = line.strip() if key: # 跳过可能的空行 sample_files[key] = [] # 遍历目录下的所有文件 for filename in os.listdir(target_dir): # 先过滤非目标文件(可选,避免匹配无关文件) if not filename.endswith('.faq.gz'): continue # 从文件名中提取ABC/DEF标识 match = re.search(r'(ABC|DEF)', filename) if not match: continue current_key = match.group(1) # 如果标识在字典中,把文件加入对应列表 if current_key in sample_files: sample_files[current_key].append(filename) # 输出结果 print(sample_files)
脚本逻辑说明
- 用
with语句操作文件,自动关闭文件句柄,比手动close()更安全; - 正则
(ABC|DEF)精准提取我们需要的标识,确保能和字典的键对应上; - 只维护一个字典,每个键对应R1和R2的文件列表,和你的预期输出结构一致;
- 增加了空行过滤和后缀过滤,避免无效匹配。
更灵活的匹配方式
如果你的列表里的字符串不是固定的ABC/DEF,而是更长的关键词(比如DB_ABC),可以把提取标识的部分改成遍历字典键的方式,更通用:
# 替换原来的正则匹配部分 for filename in os.listdir(target_dir): if not filename.endswith('.faq.gz'): continue # 遍历字典的键,检查文件名是否包含该键 for key in sample_files: if key in filename: sample_files[key].append(filename) break # 匹配到一个就停止,避免一个文件被多个键匹配
这样不管列表里的关键词是什么,只要文件名包含它,就会被加入对应的列表。
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

