Python中的fnmatch - Unix文件名模式匹配

2025 年 3 月 6 日 | 阅读 4 分钟

此模块使用类 Unix shell 的通配符匹配文件名。当单个文件名与模式匹配时,函数 fnmatch() 返回 TRUE;否则返回 FALSE。

当操作系统使用区分大小写的文件系统时,比较是区分大小写的。

Shell 风格的通配符使用以下特殊字符及其用途:

  • '*' - 匹配所有内容
  • '?' - 匹配任何单个字符
  • '[seq]' - 匹配 seq 中的任何字符
  • '[!seq]' - 匹配不在 seq 中的任何字符

要进行字面匹配,元字符需要用方括号括起来。例如,字符 '?' 匹配 "[?]"。

fnmatch 模块提供的函数

fnmatch.fnmatch(filename, pattern)

此函数根据提供的文件名字符串是否匹配模式字符串返回布尔结果。在比较之前,如果操作系统不区分大小写,则参数将被规范化为全小写或全大写。

示例:脚本用于查找所有以“.py”结尾且以“fnmatch.”开头的文件。

程序说明

Python 应用程序 展示了如何使用 fnmatch.fnmatch() 根据给定模式过滤和匹配文件名。使用 'fnmatch_*.py' 模式来确定当前目录中的每个文件名是否与其匹配。然后,打印每个文件名及其是否匹配模式的布尔值。该程序有助于根据特定的命名模式过滤和操作文件。

输出

 
$ python fnmatch_fnmatch.py
Pattern: fnmatch_*.py
Filename: __init__.py               False
Filename: fnmatch_filter.py         True
Filename: fnmatch_fnmatch.py        True
Filename: fnmatch_fnmatchcase.py    True
Filename: fnmatch_translate.py      True
Filename: index.rst                 False   

fnmatch.fnmatchcase(filename, pattern)

此方法在执行区分大小写的比较并确定提供的文件名字符串是否匹配模式字符串后返回布尔结果。

示例:无论文件系统和操作系统设置如何,用于区分大小写的比较的脚本。

程序说明

Python 程序演示了如何使用 fnmatch.fnmatchcase() 处理区分大小写的文件名模式。fnmatch 模块用于确定当前目录中的每个文件名是否与提供的区分大小写的模式 'FNMATCH_*.PY' 匹配。然后,打印每个文件名及其是否匹配模式的布尔值。对于匹配依赖于大写和小写字符之间差异的情况,fnmatch.fnmatchcase() 非常有用,因为它区分大小写。

输出

 
$ python fnmatch_fnmatchcase.py
Pattern: FNMATCH_*.PY
Filename: __init__.py               False
Filename: fnmatch_filter.py         FalseFilename: FNMATCH_FNMATCH.PY        True
Filename: fnmatch_fnmatchcase.py    False
Filename: fnmatch_translate.py      False
Filename: index.rst                 False   

fnmatch.filter(names, pattern)

此函数返回函数中提供的名称列表的子集,该子集与指定的模式匹配。

例如,可以使用多个文件扩展名来过滤文件。

程序说明

此 Python 应用程序展示了如何使用 fnmatch.filter() 和给定模式来过滤文件名列表。该应用程序使用 os.listdir('.') 从当前目录获取文件名列表,并构建一个名为 "fnmatch_*.py" 的模式。然后使用 filter 函数查找并打印与模式匹配的文件名子集。fnmatch.filter() 函数有效地减少了文件名列表中的数量,为提取匹配预定模式的文档提供了一种有用的策略。

输出

 
$ python fnmatch_filter.py
Pattern: fnmatch_*.py
Files   : ['__init__.py', 'fnmatch_filter.py', 'fnmatch_fnmatch.py', 
'fnmatch_fnmatchcase.py', 'fnmatch_translate.py', 'index.rst']
Matches : ['fnmatch_filter.py', 'fnmatch_fnmatch.py',
'fnmatch_fnmatchcase.py', 'fnmatch_translate.py']   

fnmatch.translate(pattern)

此方法将 shell 风格的模式转换为可与 re.match() 一起使用的正则表达式,re.match() 仅匹配字符串的开头,而不是每行的开头。

程序说明

此 Python 程序演示了如何使用 fnmatch.translate() 将 shell 风格的通配符模式 ('*.txt') 转换为正则表达式。然后,通过使用 re.compile() 方法编译正则表达式来创建 regex 对象。除了打印解释后的 regex 模式外,该程序还确定 regex 模式是否匹配字符串 "foobar.txt."。fnmatch.translate() 函数简化了将 shell 风格的通配符模式转换为 regex 模式的过程,使 Python 程序员能够更灵活地创建更复杂的匹配场景。

输出

 
'(?s:.*\\.txt)\\Z'
_sre.SRE_Match object; span=(0, 10), match='foobar.txt'