如何使用正则表达式处理os.listdir文件,删除前7字符匹配的文件
搞定按前缀匹配删除文件的需求
嘿,我来帮你解决这个问题!其实你的思路方向是对的,只要把正则匹配、前缀分组和删除操作串起来就行,咱们一步步来:
第一步:准备基础代码
先把需要的模块和你定义好的正则表达式搭好架子:
import os import re # 对应你给出的两个匹配规则 pattern_17 = r'^[1-9\w]{2}_[1-9\w]{4}[1][7][\d\w]+\.[\d\w]+' # 匹配带17的目标文件,比如bh_txbh171002.xml pattern_18 = r'^[1-9\w]{2}_[1-9\w]{4}[1][8]+' # 匹配带18的目标文件,比如bh_txbh180101.xml
第二步:按前7个字符给文件分组
我们先遍历目标文件夹,把符合两个正则的文件筛选出来,再按前7个字符归到同一组里——毕竟你的核心需求就是“前缀匹配就删”,分组后处理起来会特别清晰:
target_dir = "你的文件夹路径" # 记得替换成你实际的文件夹路径 file_groups = {} # 用字典存分组:key是前7个字符,value是该组下的文件列表 for filename in os.listdir(target_dir): # 检查是否符合第一个正则规则 if re.match(pattern_17, filename): prefix = filename[:7] # 直接切片获取前7个字符当分组标识 if prefix not in file_groups: file_groups[prefix] = [] file_groups[prefix].append(('type17', filename)) # 检查是否符合第二个正则规则 elif re.match(pattern_18, filename): prefix = filename[:7] if prefix not in file_groups: file_groups[prefix] = [] file_groups[prefix].append(('type18', filename))
第三步:分组处理并删除目标文件
现在每个分组里要么只有一类文件,要么同时存在17和18开头的配对文件。我们只需要处理那些有配对的分组,删除你指定的文件就行——从你的例子来看,应该是删除带18的文件?如果要删17的,改一下判断条件就好:
for prefix, files in file_groups.items(): # 验证当前分组是否同时存在两类配对文件 has_17_file = any(item[0] == 'type17' for item in files) has_18_file = any(item[0] == 'type18' for item in files) if has_17_file and has_18_file: # 遍历组内文件,删除目标类型的文件 for file_type, name in files: if file_type == 'type18': file_path = os.path.join(target_dir, name) # !重要提醒:先打印确认要删除的文件路径,没问题再执行删除 print(f"待删除文件:{file_path}") # os.remove(file_path) # 确认无误后取消这行的注释
额外小提示
- 关于
re.match:你之前的误解是错的!它就是从字符串开头匹配的,不匹配会返回None,完全适合用来判断文件名是否符合规则。 - 关于前缀获取:直接用
filename[:7]就搞定了,比startswith灵活太多——毕竟你要的是动态前缀匹配,不是固定某个字符串开头。 - 安全警告:删除文件是不可逆操作!一定要先打印待删除路径,确认都是你想删的文件,再取消
os.remove的注释哦!
内容的提问来源于stack exchange,提问作者Alexander Larionov
相关产品推荐
相关产品推荐

