Python中的fnmatch模块–文件名模式匹配

时间:2020-01-09 10:44:18  来源:igfitidea点击:

在这篇文章中,我们将了解如何在Python的fnmatch模块中使用函数,该模块提供了对Unix Shell样式通配符的支持。请注意,Unix shell样式通配符与正则表达式不同,shell样式通配符中使用的特殊字符为:

模式含义
*匹配所有内容
?匹配任何单个字符
[seq]匹配seq
[!seq]匹配seq

如果要进行文字匹配,请将元字符放在方括号中。例如," [?]"与字符"?"匹配。

Python fnmatch模块中的函数

fnmatch模块提供功能以匹配具有特定模式的文件或者具有特定模式的过滤器文件。如果要搜索具有特定扩展名的文件或者搜索具有特定格式的文件名,可以使用这些功能。

  1. fnmatch.fnmatch(filename,pattern)–此功能测试文件名字符串是否与模式字符串匹配,返回布尔值True或者False。在此函数中,两个参数都进行大小写标准化,使其不区分大小写。

这是一个Python示例,我们要搜索在2020年12月创建的日志文件,即我们需要匹配模式为2020-12-*。log的文件

import os
import fnmatch

def search_files(path, pattern):
    print('Search pattern is', pattern)
    files = os.listdir(path)
    print('All Files:', files)
    for file in files:
        if fnmatch.fnmatch(file, pattern):
            print(file)

search_files("F:/theitroad/Python/Test", "2020-12-*.log")

输出:

Search pattern is 2020-12-*.log
All Files: ['2020-11-20.log', '2020-12-20.log', '2020-12-21.log', 'newimage.png', 'Sub1', 'Sub2']
2020-12-20.log
2020-12-21.log
  1. fnmatch.fnmatchcase(文件名,模式)–与fnmatch.fnmatch类似,但区分大小写。
  2. fnmatch.filter(names,pattern)–此函数过滤与模式匹配的名称列表,并返回过滤后的列表子集。
    这是一个Python示例,其中过滤扩展名为" .txt"的文件。
import os
import fnmatch

def filter_files(path, pattern):
    print('Search pattern is', pattern)
    files = os.listdir(path)
    print('All Files:', files)
    filtered_files = fnmatch.filter(files, pattern)
    print('Filtered Files:', filtered_files)

filter_files("F:/theitroad/Python/Test", "*.txt")

输出:

Search pattern is *.txt
All Files: ['2020-11-20.log', '2020-12-20.log', '2020-12-21.log', 'abc.txt', 'newimage.png', 'Sub1', 'Sub2', 'test.txt']
Filtered Files: ['abc.txt', 'test.txt']
  1. fnmatch.translate(pattern)–此函数将shell样式的模式转换为与re.match()一起使用的正则表达式。
import fnmatch
import re

def filter_files(pattern):
    print('Search pattern is', pattern)
    regex = fnmatch.translate(pattern)
    print('Converted regex is', regex)
    reobj = re.compile(regex)
    print(reobj.match('test.txt'))
    print(reobj.match('test.log'))

filter_files("*.txt")

输出:

Search pattern is *.txt
Converted regex is (?s:.*\.txt)\Z
<re.Match object; span=(0, 8), match='test.txt'>
None