fnmatch — Unix 文件名模式匹配

源代码: Lib/fnmatch.py


此模块提供对 Unix shell 风格通配符的支持,它们与正则表达式(在 re 模块中记录) 相同。shell 风格通配符中使用的特殊字符是

模式

含义

*

匹配所有内容

?

匹配任意单个字符

[seq]

匹配 seq 中的任意字符

[!seq]

匹配不在 seq 中的任意字符

对于字面匹配,请将元字符括在方括号中。例如,'[?]' 匹配字符 '?'

请注意,文件名分隔符(Unix 上为 '/')对于此模块不是特殊的。有关路径名扩展,请参阅模块 globglob 使用 filter() 来匹配路径名段)。类似地,以句点开头的文件名对于此模块也不是特殊的,并且会通过 *? 模式进行匹配。

另请注意,functools.lru_cache()maxsize 为 32768,用于缓存以下函数中的已编译正则表达式模式:fnmatch()fnmatchcase()filter()

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)

从与模式 pat 匹配的 可迭代对象 names 的元素构造一个列表。它与 [n for n in names if fnmatch(n, pat)] 相同,但实现效率更高。

fnmatch.translate(pat)

返回转换为正则表达式的 shell 风格模式 pat,以便与 re.match() 一起使用。

示例

>>> 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 风格的路径扩展。