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

Unix Shell命令行中使用的通配符模式与正则表达式语法不同。在Python的标准库中,fnmatch模块提供了Unix通配符模式。

在fnmatch模块中定义了以下功能

fnmatch()

此功能需要两个参数-文件名和字符的字符串模式。文件名与给定的模式匹配,函数返回True或False。

以下示例列出了与当前目录中的模式“ * .py”匹配的所有文件。

>>> import glob,fnmatch
>>> for files in (glob.glob('*.*')):
if (fnmatch.fnmatch(files, "*.py")):
print (files)

fnmatchcase()

此功能类似于fnmatch()。但是,此功能对模式与文件名进行区分大小写的匹配。

在以下示例中,所有名称以'l'和'.py'扩展名开头的文件都首先收集在文件列表对象中。该fnmatch()方法仅用于打印以“ lo”字符开头的名称。

>>> files=glob.glob("l*.*")
>>> files
['LICENSE.txt', 'lines.txt', 'listwidget.ui', 'lo1.ui', 'lo2.ui', 'lo3.ui', 'logo.png', 'logo.svg', 'lw.ui']
>>> for file in files:
if fnmatch.fnmatchcase(file,"lo*.*")==True:
print (file)
lo1.ui
lo2.ui
lo3.ui
logo.png
logo.svg

过滤()

此函数仅返回名称与给定pattern参数匹配的文件。

以下语句返回当前目录中所有扩展名为'.txt'的文件的列表。

>>> fnmatch.filter(files,"*.txt")
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt', 'zen.txt', 'zen1.txt', 'zenbak.txt']

翻译()

此功能对于将UNIX样式模式转换为相应的RegEx形式很有用。translate()函数的返回值应使用compile()re模块的函数以正则表达式转换。然后将其用于匹配模式。

>>> pattern="*.txt"
>>> import re
>>> reg=fnmatch.translate(pattern)
>>> reg
'(?s:.*\\.txt)\\Z'
>>> rec=re.compile(reg)
>>> for file in glob.glob("*.*"):
if re.match(rec,file):
print (file)

在本文中,已经解释了fnmatch模块中的功能。