You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:41:05