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中的Cookie模块使用
Jul 06 Python
python实现朴素贝叶斯分类器
Mar 28 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
Python实现的求解最小公倍数算法示例
May 03 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
Python函数中的可变长参数详解
Sep 12 Python
Python 生成VOC格式的标签实例
Mar 10 Python
在ipython notebook中使用argparse方式
Apr 20 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
Python实现区域填充的示例代码
Feb 03 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
php如何调用webservice应用介绍
2012/11/24 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
Python编程实现正则删除命令功能
2017/08/30 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
Python多线程扫描端口代码示例
2018/02/09 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
Django中template for如何使用方法
2021/01/31 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
记者岗位职责
2014/01/06 职场文书
知识竞赛活动方案
2014/02/18 职场文书
毕业评语大全
2014/05/04 职场文书
公司规章制度范本
2015/08/03 职场文书
高一军训口号
2015/12/25 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
Windows7下FTP搭建图文教程
2022/08/05 Servers
Java使用HttpClient实现文件下载
2022/08/14 Java/Android