python fnmatch module

介绍

在python中,fnmatch模块是用来做字符串匹配文件名的标准库。

源码: Lib/fnmatch.py

fnmatch支持的通配符:

通配符 含义
* 匹配任何数量的字符
匹配单个字符
[seq] 匹配seq中的字符
[!seq] 匹配除seq以外的任何字符

使用

1
2
3
>>> import fnmatch
>>> fnmatch.__all__
['filter', 'fnmatch', 'fnmatchcase', 'translate']

fnmatch这个库相对比较简单,只有4个函数,分别是fnmatch、fnmatchcase、filter和translate,其中最常用的是fnmatch。主要功能如下:

  • fnmatch:判断文件名是否符合特定的模式。
  • fnmatchcase:判断文件名是否符合特定的模式,区分大小写。
  • filter:返回输入列表中,符合特定模式的文件名列表。
  • translate:将通配符模式转换成正则表达式。

示例

fnmatch.fnmatch

1
语法:fnmatch(name, pat)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> file_list = ['A1.jpg', 'a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg']

# 匹配图片
>>> [name for name in file_list if fnmatch.fnmatch(name, '*.jpg')]
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']

>>> [name for name in file_list if fnmatch.fnmatch(name, '*.JPG')]
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']

# 上述方式等效于如下:
>>> [name for name in file_list if name.endswith('.jpg')]
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']

注:fnmatch.fnmatch 方式匹配文件名时,不区分大小写,即大小写不敏感。

fnmatch.fnmatchcase

1
语法:fnmatchcase(name, pat)
1
2
3
4
5
6
7
8
9
10
>>> file_list = ['A1.jpg', 'a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg']

>>> [name for name in file_list if fnmatch.fnmatchcase(name, '*.jpg')]
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']

# 大些的 *.JPG 将匹配不到
>>> [name for name in file_list if fnmatch.fnmatchcase(name, '*.JPG')]
[]

注:fnmatch.fnmatchcase 用法与 fnmatch.fnmatch相同,区别是其大小写敏感。

fnmatch.filter

1
语法:filter(names, pat)
1
2
3
4
5
6
>>> file_list = ['A1.jpg', 'a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg']

>>> fnmatch.filter(file_list, '*.jpg')
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']
>>> fnmatch.filter(file_list, '*.JPG')
['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg']

fnmatch.translate

1
语法:translate(pat)
1
2
>>> fnmatch.translate('*jpg')
'(?s:.*jpg)\\Z'
-------------本文结束感谢您的阅读-------------