fnmatch:Unix式glob模式匹配,简单场景下可以代替正则

 
 
fnmatch是模块用来匹配(通过glob模式、如Unix shell所使用的的模式)文件名的,当然不仅是文件名,普通的字符串也可以进行匹配。

规则如下:

  • ?:匹配一个任意字符
  • *:匹配任意个任意字符
  • [sequence]:匹配出现在sequence里面的一个字符
  • [!sequence]:匹配没有出现在sequence里面的一个字符
  • [a-m]:匹配出现在abcdef...m中的字符
  • [A-M]:匹配出现在ABCDEF...M中的字符
  • [0-9]:匹配出现在0123...9中的字符

下面我们来看一下用法:

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
'''

可以使用 filter,会返回与模式参数匹配的列表。

 
import fnmatch
import os
from pprint import pprint
 

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']
'''

当然在内部,fnmatch 也是将 glob 模式转换为一个正则表达式,并使用re 模块比较文件名(字符串)和模式。

我们可以使用 translate 函数,查看 glob 模式转换为正则表达式后的结果。

import fnmatch
 
pattern = "base_*.py"
print(fnmatch.translate(pattern))  # (?s:base_.*\.py)\Z

还是很方便的,在一些匹配不是很复杂的情况下,可以使用 fnmatch 来替代正则表达式。

posted @ 2019-11-16 23:08  古明地盆  阅读(437)  评论(0编辑  收藏  举报