如何用Python通过通配符匹配筛选文件相对路径?
使用Python实现文件路径与通配符规则的匹配
当然可以用Python标准库实现这个需求,下面提供两种实用方案:
方案一:使用pathlib模块(推荐,Python 3.4+)
pathlib的Path.match()方法原生支持**递归通配符(匹配任意层级的子目录),非常适合处理这类路径字符串匹配场景。
from pathlib import Path def is_path_matched(path_str, rules): path = Path(path_str) # 遍历规则,只要匹配任一规则就返回True return any(path.match(rule) for rule in rules) # 测试示例 file_list = ['aaa/file1.txt', 'bbb/ccc/file2.txt', 'ddd/file3.txt'] match_rules = ['aaa/*', 'bbb/**/*'] for file_path in file_list: print(f"{file_path}: {is_path_matched(file_path, match_rules)}")
运行输出:
aaa/file1.txt: True bbb/ccc/file2.txt: True ddd/file3.txt: False
方案二:使用fnmatch模块(兼容低版本Python)
fnmatch默认不支持**递归匹配,但可以通过将规则转换为正则表达式并手动处理**来实现:
import fnmatch import re def is_path_matched_fnmatch(path_str, rules): for rule in rules: # 将通配符规则转为正则表达式模板 regex_pattern = fnmatch.translate(rule) # 替换**为匹配任意层级目录的正则片段 regex_pattern = regex_pattern.replace(r'\*\*', r'[^/]*(/[^/]*)*') # 全匹配校验 if re.fullmatch(regex_pattern, path_str): return True return False # 测试示例 file_list = ['aaa/file1.txt', 'bbb/ccc/file2.txt', 'ddd/file3.txt'] match_rules = ['aaa/*', 'bbb/**/*'] for file_path in file_list: print(f"{file_path}: {is_path_matched_fnmatch(file_path, match_rules)}")
关于glob模块
glob模块主要用于搜索本地文件系统中符合规则的文件,而非直接匹配字符串。如果你的文件实际存在于本地,可以用glob.glob()结合recursive=True参数获取匹配的文件路径,再与你的文件列表对比,但仅做字符串匹配的话,上面两种方案更高效。
内容的提问来源于stack exchange,提问作者IgorZ
相关产品推荐
相关产品推荐

