欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中fnmatch模塊的使用詳情

 更新時(shí)間:2018年11月30日 09:01:09   作者:廖高祥  
這篇文章主要介紹了Python中fnmatch模塊的使用詳情,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

fnamtch就是filenamematch, 在python中利用符合linuxshell風(fēng)格的匹配模塊來進(jìn)行文件名的匹配篩選工作。

fnmatch()函數(shù)匹配能力介于簡(jiǎn)單的字符串方法和強(qiáng)大的正則表達(dá)式之間,如果在數(shù)據(jù)處理操作中只需要簡(jiǎn)單的通配符就能完成的時(shí)候,這通常是一個(gè)比較合理的方案。此模塊的主要作用是文件名稱的匹配,并且匹配的模式使用的Unix shell風(fēng)格。源碼很簡(jiǎn)單:

"""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個(gè)函數(shù)["filter", "fnmatch", "fnmatchcase", "translate"]

filter 返回列表形式的結(jié)果

def gen_find(filepat, top):
  """
  查找符合Shell正則匹配的目錄樹下的所有文件名
  :param filepat: shell正則
  :param top: 目錄路徑
  :return: 文件絕對(duì)路徑生成器
  """
  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() 方法對(duì)于過濾一個(gè)目錄的內(nèi)容也是很有用的

fnmatchcase 區(qū)分大小寫的文件匹配

# 這兩個(gè)函數(shù)通常會(huì)被忽略的一個(gè)特性是在處理非文件名的字符串時(shí)候它們也是很有用的。 比如,假設(shè)你有一個(gè)街道地址的列表數(shù)據(jù)
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 這個(gè)似乎很少有人用到,前面說了fnmatch是Unix shell匹配風(fēng)格,可以使用translate將其轉(zhuǎn)換為正則表達(dá)式,舉個(gè)栗子

shell_match = 'Celery_?*.py'
print(translate(shell_match))
# 輸出結(jié)果:(?s:Celery_..*\.py)\Z

Celery_..*\.py就是正則表達(dá)式的寫法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pycharm中運(yùn)行程序在Python?console中執(zhí)行,不是直接Run問題

    Pycharm中運(yùn)行程序在Python?console中執(zhí)行,不是直接Run問題

    這篇文章主要介紹了Pycharm中運(yùn)行程序在Python?console中執(zhí)行,不是直接Run問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • pyCharm中python對(duì)象的自動(dòng)提示方式

    pyCharm中python對(duì)象的自動(dòng)提示方式

    這篇文章主要介紹了pyCharm中python對(duì)象的自動(dòng)提示方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python多進(jìn)程重復(fù)加載的解決方式

    python多進(jìn)程重復(fù)加載的解決方式

    今天小編就為大家分享一篇python多進(jìn)程重復(fù)加載的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python之pkl文件的用法及說明

    python之pkl文件的用法及說明

    這篇文章主要介紹了python之pkl文件的用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 哈工大自然語言處理工具箱之ltp在windows10下的安裝使用教程

    哈工大自然語言處理工具箱之ltp在windows10下的安裝使用教程

    這篇文章主要介紹了哈工大自然語言處理工具箱之ltp在windows10下的安裝使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python3 ffmpeg視頻轉(zhuǎn)換工具使用方法解析

    Python3 ffmpeg視頻轉(zhuǎn)換工具使用方法解析

    這篇文章主要介紹了Python3 ffmpeg視頻轉(zhuǎn)換工具使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Pytorch GPU顯存充足卻顯示out of memory的解決方式

    Pytorch GPU顯存充足卻顯示out of memory的解決方式

    今天小編就為大家分享一篇Pytorch GPU顯存充足卻顯示out of memory的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python 比較字典value的最大值的幾種方法

    python 比較字典value的最大值的幾種方法

    這篇文章主要介紹了python 比較字典value的最大值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python密碼學(xué)Vignere密碼教程

    python密碼學(xué)Vignere密碼教程

    這篇文章主要為大家介紹了python密碼學(xué)Vignere密碼教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Numpy中關(guān)于arctan和arctan2的區(qū)別

    Numpy中關(guān)于arctan和arctan2的區(qū)別

    這篇文章主要介紹了Numpy中關(guān)于arctan和arctan2的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論