介绍
fnmatch模块用于根据glob模式(如Unix shell所使用的的模式)比较文件名
简单匹配
import fnmatch
'''
fnmatch将一个文件名与一个模式进行比较,并返回一个布尔值,指示二者是否匹配。
如果操作系统使用一个区分大小写的文件系统,则这个比较就是区分大小写的
?:匹配一个任意字符
*:匹配任意个任意字符
[sequence]:匹配出现在sequence里面的一个字符
[!sequence]:匹配没有出现在sequence里面的一个字符
[a-m]:匹配出现在abcdef...m中的字符
[A-M]:匹配出现在ABCDEF...M中的字符
[0-9]:匹配出现在0123...9中的字符
'''
# 虽说是用来匹配文件名的,但是我匹配普通的字符串也是可以的
# 注意返回的是一个bool值
print(fnmatch.fnmatch("abcde", "*")) # True
print(fnmatch.fnmatch("abcde", "abc?")) # False
print(fnmatch.fnmatch("abcde", "abc??")) # True
print(fnmatch.fnmatch("abcde", "[a-z]????")) # True
print(fnmatch.fnmatch("aaa", "aaa*")) # True
print(fnmatch.fnmatch("1ab", "[0-1]??")) # True
# 注意fnmatch默认是大小写不敏感的
print(fnmatch.fnmatch("Aaa", "aaa")) # True
# 如果我想区分大小写呢?可以使用fnmatchcase
print(fnmatch.fnmatchcase("Aaa", "aaa")) # False
import os
for name in os.listdir(r"C:\python37\Lib\asyncio"):
if fnmatch.fnmatch(name, "base_*.py"):
print(name)
'''
base_events.py
base_futures.py
base_subprocess.py
base_tasks.py
'''
过滤
import fnmatch import os from pprint import pprint ''' 要测试一个文件名序列,可以使用filter,会返回与模式参数匹配的文件名列表 ''' f = os.listdir(r"C:\python37\Lib\asyncio") pprint(f) ''' ['base_events.py', 'base_futures.py', 'base_subprocess.py', 'base_tasks.py', 'constants.py', 'coroutines.py', 'events.py', 'format_helpers.py', 'futures.py', 'locks.py', 'log.py', 'proactor_events.py', 'protocols.py', 'queues.py', 'runners.py', 'selector_events.py', 'sslproto.py', 'streams.py', 'subprocess.py', 'tasks.py', 'transports.py', 'unix_events.py', 'windows_events.py', 'windows_utils.py', '__init__.py', '__pycache__'] ''' print(fnmatch.filter(f, "base_*.py")) ''' ['base_events.py', 'base_futures.py', 'base_subprocess.py', 'base_tasks.py'] '''
转换模式
import fnmatch ''' 在内部,fnmatch将glob模式转换为一个正则表达式,并使用re模块比较文件名和模式。 translate函数是将glob模式转换为正则表达式的公共API ''' pattern = "base_*.py" print(fnmatch.translate(pattern)) # (?s:base_.*\.py)\Z