Python正则匹配删除指定文件报错求助:匹配规则??_????17*.*
嘿,我来帮你排查下代码里的问题,然后给你一个能正常运行的版本~
你的代码里主要有这几个问题:
正则表达式写得不对
你写的r'\w\w[_]\w\w\w\w[1][7]\w+[.]\w+'有点冗余还不符合需求:- 像
[_]、[1][7]这种写法没必要,直接写_、17就行; [.]虽然能匹配.,但你要的是“扩展名不限”,后面的\w+[.]\w+只能匹配类似abc.txt的格式,没法处理像abc.txt - Copy(2)这种带额外字符的文件名,应该改成.*来匹配17之后的所有内容;- 另外,用
\w{2}代替\w\w、\w{4}代替\w\w\w\w,可读性会更好。
正确的正则应该是r'^\w{2}_\w{4}17.*',完美对应你要的??_????17*.*规则。
- 像
传参错误导致核心报错
你调用matching函数时传了testfolder(这是一个文件名列表),但re.search只能处理单个字符串,这就是你看到报错的直接原因——把列表塞给了需要字符串的函数。循环逻辑完全走不通
for item in testfolder.index(matching)这行完全不符合Python语法:testfolder.index()要传具体的文件名,不能传函数;- 就算能拿到索引,
item是数字不是文件名; - 后面的
item.name(matching, s)更是无稽之谈,字符串根本没有name方法。
匹配函数的设计不符合需求
你需要的是判断文件名是否符合规则,所以函数应该返回True/False,而不是返回“Files don't exist!”这种字符串,不然没法用来做删除判断。
修复后的完整代码
我给你写了一个清晰的版本,加了注释方便理解:
import os import re # 目标文件夹路径 dir_name = "/Python/Test_folder" # 匹配规则的正则表达式,完全对应你的需求 pattern = r'^\w{2}_\w{4}17.*' # 获取文件夹内所有条目(文件+文件夹) folder_items = os.listdir(dir_name) def is_file_matching(filename): # 判断单个文件名是否符合规则,返回布尔值 return re.match(pattern, filename) is not None # 遍历每个条目 for item in folder_items: # 拼接完整路径 full_path = os.path.join(dir_name, item) # 确保是文件(不是文件夹)且符合规则,再删除 if os.path.isfile(full_path) and is_file_matching(item): os.remove(full_path) print(f"已成功删除:{item}")
额外小提示
- 用
re.match代替re.search,因为我们需要从文件名开头就匹配规则,避免误删中间包含??_????17的文件名; - 加了
os.path.isfile判断,防止不小心删除文件夹; - 打印删除日志,方便你确认哪些文件被处理了。
内容的提问来源于stack exchange,提问作者Alexander Larionov
相关产品推荐
相关产品推荐

