import fnmatch是 Python 中导入标准库模块fnmatch的语句。该模块用于基于 Unix shell 风格通配符(如*、?、[abc])进行文件名或字符串的模式匹配,常用于文件过滤(例如配合os.listdir()使用),但不支持正则表达式语法。
常用函数包括:
fnmatch.fnmatch(filename, pattern):判断单个字符串是否匹配通配符模式(区分大小写,Windows 下默认不区分);fnmatch.fnmatchcase(filename, pattern):严格区分大小写的匹配;fnmatch.filter(names, pattern):对字符串列表进行批量匹配筛选;fnmatch.translate(pattern):将 shell 通配符模式转换为等价的正则表达式(供高级使用)。
示例:
importfnmatchimportos files=os.listdir('.')py_files=fnmatch.filter(files,"*.py")print(py_files)# 输出所有以 .py 结尾的文件名注意:fnmatch适用于简单模式匹配;如需复杂逻辑,请使用re模块。
fnmatch和re(正则表达式)模块在 Python 中都用于模式匹配,但设计目标、语法能力与适用场景有本质区别:
✅核心区别总结:
| 维度 | fnmatch | re(re模块) |
|---|---|---|
| 设计目的 | 模拟 Unix shell 通配符(如*.txt,file[0-9].log),专为文件名/简单字符串匹配优化 | 提供通用、强大、图灵完备的正则表达式引擎,适用于任意文本结构解析 |
| 语法风格 | Shell 风格:*(任意字符序列)、?(单个任意字符)、[abc]或[a-z](字符类) | PCRE 衍生语法:.*、.+、\d、^、$、分组( )、捕获、断言、贪婪/非贪婪等 |
| 功能能力 | ❌ 不支持捕获组、反向引用、零宽断言、替换、编译复用(虽可fnmatch.translate()转正则,但非原生)✅ 简单、安全、轻量,无注入风险(不执行任意代码) | ✅ 支持捕获、替换(re.sub)、编译缓存(re.compile)、多标志(re.IGNORECASE)、性能优化(预编译)⚠️ 复杂正则易写错,过度使用可能影响可读性与性能 |
| 典型用途 | os.listdir()过滤文件名、glob.glob()底层支撑、配置项通配匹配(如日志轮转规则) | 文本抽取(邮箱、URL、JSON 字段)、格式校验(密码强度、手机号)、日志解析、HTML/XML 片段提取等 |
| 大小写敏感性 | 取决于平台:Windows 默认不区分,Linux/macOS 区分;可用fnmatchcase()强制区分 | 默认区分,通过re.IGNORECASE标志控制 |
📌一句话概括:
fnmatch是「轻量级文件名通配器」,追求简洁与安全性;re是「工业级文本处理引擎」,追求表达力与灵活性。
示例对比(匹配以test开头、下划线后接数字、以.py结尾的文件):
importfnmatch,re name="test_123.py"# fnmatch —— 简洁直观print(fnmatch.fnmatch(name,"test_[0-9]*.py"))# True(注意:[0-9]* 中 * 是 fnmatch 的通配符,非正则)# re —— 更精确可控(支持 \d、+、边界等)print(bool(re.fullmatch(r"test_\d+\.py",name)))# True(需转义点号,\d+ 表示一个及以上数字)