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

首頁 > 編程 > Python > 正文

Python中fnmatch模塊的使用詳情

2020-02-15 23:52:00
字體:
來源:轉載
供稿:網友

fnamtch就是filenamematch, 在python中利用符合linuxshell風格的匹配模塊來進行文件名的匹配篩選工作。

fnmatch()函數(shù)匹配能力介于簡單的字符串方法和強大的正則表達式之間,如果在數(shù)據(jù)處理操作中只需要簡單的通配符就能完成的時候,這通常是一個比較合理的方案。此模塊的主要作用是文件名稱的匹配,并且匹配的模式使用的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            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 贞丰县| 苍梧县| 资溪县| 离岛区| 巴林右旗| 洪洞县| 郑州市| 兴化市| 太白县| 唐海县| 丰城市| 公安县| 绵阳市| 蒙自县| 康平县| 西宁市| 驻马店市| 醴陵市| 大田县| 舒兰市| 哈巴河县| 元谋县| 红河县| 竹山县| 正宁县| 平凉市| 广德县| 延长县| 安化县| 新泰市| 河津市| 泉州市| 津南区| 汶上县| 渝北区| 西安市| 石景山区| 通州区| 河曲县| 翁牛特旗| 许昌市|