Python中fnmatch模块的使用详情


Posted in Python onNovember 30, 2018

fnamtch就是filenamematch, 在python中利用符合linuxshell风格的匹配模块来进行文件名的匹配筛选工作。

fnmatch()函数匹配能力介于简单的字符串方法和强大的正则表达式之间,如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。此模块的主要作用是文件名称的匹配,并且匹配的模式使用的Unix shell风格。源码很简单:

"""Filename matching with shell patterns.

fnmatch(FILENAME, PATTERN) matches according to the local convention.
fnmatchcase(FILENAME, PATTERN) always takes case in account.

The functions operate by translating the pattern into a regular
expression. They cache the compiled regular expressions for speed.

The function translate(PATTERN) returns a regular expression
corresponding to PATTERN. (It does not compile it.)
"""
import os
import posixpath
import re
import functools

__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"]

def fnmatch(name, pat):
  """Test whether FILENAME matches PATTERN.

  Patterns are Unix shell style:

  *    matches everything
  ?    matches any single character
  [seq]  matches any character in seq
  [!seq] matches any char not in seq

  An initial period in FILENAME is not special.
  Both FILENAME and PATTERN are first case-normalized
  if the operating system requires it.
  If you don't want this, use fnmatchcase(FILENAME, PATTERN).
  """
  name = os.path.normcase(name)
  pat = os.path.normcase(pat)
  return fnmatchcase(name, pat)

@functools.lru_cache(maxsize=256, typed=True)
def _compile_pattern(pat):
  if isinstance(pat, bytes):
    pat_str = str(pat, 'ISO-8859-1')
    res_str = translate(pat_str)
    res = bytes(res_str, 'ISO-8859-1')
  else:
    res = translate(pat)
  return re.compile(res).match

def filter(names, pat):
  """Return the subset of the list NAMES that match PAT."""
  result = []
  pat = os.path.normcase(pat)
  match = _compile_pattern(pat)
  if os.path is posixpath:
    # normcase on posix is NOP. Optimize it away from the loop.
    for name in names:
      if match(name):
        result.append(name)
  else:
    for name in names:
      if match(os.path.normcase(name)):
        result.append(name)
  return result

def fnmatchcase(name, pat):
  """Test whether FILENAME matches PATTERN, including case.

  This is a version of fnmatch() which doesn't case-normalize
  its arguments.
  """
  match = _compile_pattern(pat)
  return match(name) is not None


def translate(pat):
  """Translate a shell PATTERN to a regular expression.

  There is no way to quote meta-characters.
  """

  i, n = 0, len(pat)
  res = ''
  while i < n:
    c = pat[i]
    i = i+1
    if c == '*':
      res = res + '.*'
    elif c == '?':
      res = res + '.'
    elif c == '[':
      j = i
      if j < n and pat[j] == '!':
        j = j+1
      if j < n and pat[j] == ']':
        j = j+1
      while j < n and pat[j] != ']':
        j = j+1
      if j >= n:
        res = res + '\\['
      else:
        stuff = pat[i:j].replace('\\','\\\\')
        i = j+1
        if stuff[0] == '!':
          stuff = '^' + stuff[1:]
        elif stuff[0] == '^':
          stuff = '\\' + stuff
        res = '%s[%s]' % (res, stuff)
    else:
      res = res + re.escape(c)
  return r'(?s:%s)\Z' % res

fnmatch的中的5个函数["filter", "fnmatch", "fnmatchcase", "translate"]

filter 返回列表形式的结果

def gen_find(filepat, top):
  """
  查找符合Shell正则匹配的目录树下的所有文件名
  :param filepat: shell正则
  :param top: 目录路径
  :return: 文件绝对路径生成器
  """
  for path, _, filenames in os.walk(top):
    for file in fnmatch.filter(filenames, filepat):
      yield os.path.join(path, file)

fnmatch

# 列出元组中所有的python文件
pyfiles = [py for py in ('restart.py', 'index.php', 'file.txt') if fnmatch(py, '*.py')]
# 字符串的 startswith() 和 endswith() 方法对于过滤一个目录的内容也是很有用的

fnmatchcase 区分大小写的文件匹配

# 这两个函数通常会被忽略的一个特性是在处理非文件名的字符串时候它们也是很有用的。 比如,假设你有一个街道地址的列表数据
address = [
  '5412 N CLARK ST',
  '1060 W ADDISON ST',
  '1039 W GRANVILLE AVE',
  '2122 N CLARK ST',
  '4802 N BROADWAY',
]
print([addr for addr in address if fnmatchcase(addr, '* ST')])

translate 这个似乎很少有人用到,前面说了fnmatch是Unix shell匹配风格,可以使用translate将其转换为正则表达式,举个栗子

shell_match = 'Celery_?*.py'
print(translate(shell_match))
# 输出结果:(?s:Celery_..*\.py)\Z

Celery_..*\.py就是正则表达式的写法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字符串匹配算法KMP实例
Jul 18 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
Python日志logging模块功能与用法详解
Apr 09 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
Python中的流程控制详解
Feb 18 Python
pycharm 解除默认unittest模式的方法
Nov 30 #Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 #Python
基于python实现名片管理系统
Nov 30 #Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 #Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 #Python
python实现简单名片管理系统
Nov 30 #Python
python3学生名片管理v2.0版
Nov 29 #Python
You might like
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
php str_pad 函数用法简介
2009/07/11 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
layui实现数据分页功能
2019/07/27 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
python如何实现代码检查
2019/06/28 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
德国网上药房:Apotal
2017/04/04 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
餐饮投资计划书
2014/04/25 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
工程部岗位职责范本
2015/04/11 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android