# module 'fnmatch' -- filename matching with shell patterns def fnmatch(name, pat): # # Check for simple case: no special characters # if not ('*' in pat or '?' in pat or '[' in pat): return name = pat # # Check for common cases: *suffix and prefix* # if pat[0] = '*': p1 = pat[1:] if not ('*' in p1 or '?' in p1 or '[' in p1): start = len(name) - len(p1) return start >= 0 and name[start:] = p1 elif pat[-1:] = '*': p1 = pat[:-1] if not ('*' in p1 or '?' in p1 or '[' in p1): return name[:len(p1)] = p1 # # General case # return fnmatch1(name, pat) def fnmatch1(name, pat): for i in range(len(pat)): c = pat[i] if c = '*': p1 = pat[i+1:] if not ('*' in p1 or '?' in p1 or '[' in p1): start = len(name) - len(p1) return start >= 0 and name[start:] = p1 for i in range(i, len(name) + 1): if fnmatch1(name[i:], p1): return 1 return 0 elif c = '?': if len(name) <= i : return 0 elif c = '[': c, rest = name[i], name[i+1:] i, n = i+1, len(pat) - 1 match = 0 exclude = 0 if i < n and pat[i] = '!': exclude = 1 i = i+1 while i < n: if pat[i] = c: match = 1 i = i+1 if i >= n or pat[i] = ']': break if pat[i] = '-': i = i+1 if i >= n or pat[i] = ']': break match = (pat[i-2] <= c <= pat[i]) i = i+1 if match = exclude: return 0 return fnmatch1(rest, pat[i+1:]) else: if name[i:i+1] <> c: return 0 return 1 def fnmatchlist(names, pat): res = [] for name in names: if fnmatch(name, pat): res.append(name) return res