fnmatch – Python中的 Unix 文件名模式匹配
该模块用于匹配 Unix shell 样式的通配符。 fnmatch() 将单个文件名与模式进行比较,如果匹配则返回 TRUE,否则返回 FALSE。
当操作系统使用区分大小写的文件系统时,比较区分大小写。
在 shell 风格的通配符中使用的特殊字符及其功能是:
- '*' -匹配所有内容
- “?” –匹配任何单个字符
- '[seq]' -匹配 seq 中的任何字符
- '[!seq]' -匹配任何不在 seq 中的字符
元字符应括在括号中以进行字面量匹配。例如,'[?]' 匹配字符'?'。
fnmatch 模块提供的功能
- fnmatch.fnmatch(filename, pattern) :此函数测试给定的文件名字符串是否与模式字符串匹配并返回一个布尔值。如果操作系统不区分大小写,则在执行比较之前,两个参数都将被标准化为全部小写或大写。
示例:用于搜索所有以“fnmatch”开头并以“.py”结尾的文件的脚本
# Python program to illustrate # fnmatch.fnmatch(filename, pattern) import fnmatch import os pattern = 'fnmatch_*.py' print ('Pattern :', pattern ) print() files = os.listdir('.') for name in files: print ('Filename: %-25s %s' % (name, fnmatch.fnmatch(name, pattern))
输出 :
$ 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 program to illustrate # fnmatch.fnmatchcase(filename, pattern) import fnmatch import os pattern = 'FNMATCH_*.PY' print ('Pattern :', pattern) print() files = os.listdir('.') for name in files: (print 'Filename: %-25s %s' % (name, fnmatch.fnmatchcase(name, pattern)))
输出 :
$ python fnmatch_fnmatchcase.py Pattern : FNMATCH_*.PY Filename: __init__.py False Filename: fnmatch_filter.py False Filename: FNMATCH_FNMATCH.PY True Filename: fnmatch_fnmatchcase.py False Filename: fnmatch_translate.py False Filename: index.rst False
- fnmatch.filter(names, pattern):此函数返回与给定模式匹配的函数中传递的名称列表的子集。
示例:按多个文件扩展名过滤文件。
# Python program to illustrate # fnmatch.filter(names, pattern) import fnmatch import os pattern = 'fnmatch_*.py' print ('Pattern :', pattern ) files = os.listdir('.') print ('Files :', files) print ('Matches :', fnmatch.filter(files, pattern))
输出 :
$ 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 program to illustrate # fnmatch.translate(pattern) import fnmatch, re regex = fnmatch.translate('*.txt') reobj = re.compile(regex) print(regex) print(reobj.match('foobar.txt'))
输出 :
'(?s:.*\\.txt)\\Z' _sre.SRE_Match object; span=(0, 10), match='foobar.txt'