国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 新源县| 定边县| 海阳市| 银川市| 桐柏县| 平定县| 汝城县| 昌乐县| 利津县| 浙江省| 正安县| 南华县| 龙州县| 洛阳市| 抚顺县| 家居| 舒兰市| 时尚| 边坝县| 赣州市| 陇川县| 新泰市| 鄄城县| 金塔县| 洮南市| 洪江市| 青铜峡市| 敦化市| 济阳县| 林周县| 西昌市| 海盐县| 徐汇区| 运城市| 廊坊市| 习水县| 郁南县| 鄂温| 黄冈市| 鹿泉市| 河西区|