Skip to main content

11.8. fnmatch — Unix文件名模式匹配

源代码: Lib/fnmatch.py


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

模式

含义

*

匹配一切

?

匹配任何单个字符

[seq]

匹配 seq 中的任何字符

[!seq]

匹配不在 seq 中的任何字符

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

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

fnmatch.fnmatch(filename, pattern)

测试 filename 字符串是否匹配 pattern 字符串,返回 TrueFalse。如果操作系统不区分大小写,则在执行比较之前,两个参数都将归一化为所有大小写。 fnmatchcase() 可用于执行区分大小写的比较,无论是否为操作系统的标准。

此示例将使用扩展名 .txt 打印当前目录中的所有文件名:

import fnmatch
import os

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

测试 filename 是否与 pattern 匹配,返回 TrueFalse;比较是区分大小写的。

fnmatch.filter(names, pattern)

返回与 pattern 匹配的 names 列表的子集。它与 [n for n in names if fnmatch(n, pattern)] 相同,但是更高效地实现。

fnmatch.translate(pattern)

返回转换为正则表达式的shell样式 pattern 以便与 re.match() 一起使用。

例:

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

参见

模块 glob

Unix shell样式的路径扩展。