fnmatch --- Unix 文件名模式匹配

源代码: Lib/fnmatch.py


此模块支持 Unix shell 风格的通配符,它与正则表达式(在 re 模块中介绍)并不相同。shell 风格通配符所使用的特殊字符如下:

模式

含义

*

匹配所有

?

匹配任意单个字符

[seq]

匹配 seq 中的任意字符

[!seq]

匹配不在 seq 中的任意字符

对于字面值匹配,请将元字符用方括号括起来。例如,'[?]' 匹配字符 '?'

请注意文件名分隔符(在 Unix 上为 '/')在此模块中没有特殊含义。有关路径名扩展,请参见 glob 模块(glob 使用 filter() 来匹配路径名的各部分)。类似地,以句点开头的文件名在此模块中也没有特殊含义,可由 *? 模式匹配。

除非另有说明,“文件名字符串”和“模式字符串”指的是 strISO-8859-1 编码的 bytes 对象。请注意,下面文档中介绍的函数不允许混合使用 bytes 模式和 str 文件名,反之亦然。

最后,请注意,以下函数中使用 maxsize 为 32768 的 functools.lru_cache() 来缓存(已指定类型的)已编译正则表达式模式:fnmatch(), fnmatchcase(), filter(), filterfalse()

fnmatch.fnmatch(name, pat)

测试文件名字符串 name 是否匹配模式字符串 pat,返回 TrueFalse。两个形参都会使用 os.path.normcase() 进行大小写规范化。fnmatchcase() 可用于执行区分大小写的比较,无论这对于操作系统是否为标准行为。

这个例子将打印当前目录下所有扩展名为 .txt 的文件名:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
fnmatch.fnmatchcase(name, pat)

测试文件名字符串 name 是否匹配模式字符串 pat,返回 TrueFalse;此比较区分大小写并且不会应用 os.path.normcase()

fnmatch.filter(names, pat)

根据文件名字符串 可迭代对象 names 中能匹配模式字符串 pat 的元素,构建一个列表。这等价于 [n for n in names if fnmatch(n, pat)],但实现效率更高。

fnmatch.filterfalse(names, pat)

根据文件名字符串 可迭代对象 names 中不能匹配模式字符串 pat 的元素,构建一个列表。这等价于 [n for n in names if not fnmatch(n, pat)],但实现效率更高。

在 3.14 版本加入。

fnmatch.translate(pat)

返回 shell 风格的模式 pat 转换成的正则表达式,用于 re.match()。该模式应为 str

示例

>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>

参见

glob 模块

Unix shell 风格的路径扩展。