国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中fnmatch模塊的使用詳情

2020-01-04 13:57:49
字體:
來源:轉載
供稿:網友

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 regularexpression. They cache the compiled regular expressions for speed.The function translate(PATTERN) returns a regular expressioncorresponding to PATTERN. (It does not compile it.)"""import osimport posixpathimport reimport 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).matchdef 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 resultdef 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 Nonedef 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就是正則表達式的寫法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 米林县| 南岸区| 山阴县| 景谷| 莲花县| 仲巴县| 沂源县| 黔西| 通化市| 长顺县| 古交市| 常州市| 青阳县| 兴山县| 静海县| 乐山市| 金湖县| 邵武市| 韶关市| 延吉市| 馆陶县| 泾阳县| 山东| 泰和县| 靖西县| 顺平县| 海安县| 枣强县| 边坝县| 洛南县| 冷水江市| 开封县| 舒兰市| 郴州市| 自治县| 区。| 加查县| 佛学| 临沧市| 巴林右旗| 宿州市|