home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyth_os2.zip / python-1.0.2 / Lib / fnmatch.py < prev    next >
Text File  |  1993-12-29  |  1KB  |  57 lines

  1. # module 'fnmatch' -- filename matching with shell patterns
  2. # This version translates the pattern to a regular expression
  3. # and moreover caches the expressions.
  4.  
  5. import os
  6. import regex
  7.  
  8. cache = {}
  9.  
  10. def fnmatch(name, pat):
  11.     name = os.path.normcase(name)
  12.     pat = os.path.normcase(pat)
  13.     if not cache.has_key(pat):
  14.         res = translate(pat)
  15.         save_syntax = regex.set_syntax(0)
  16.         cache[pat] = regex.compile(res)
  17.         save_syntax = regex.set_syntax(save_syntax)
  18.     return cache[pat].match(name) == len(name)
  19.  
  20. def translate(pat):
  21.     i, n = 0, len(pat)
  22.     res = ''
  23.     while i < n:
  24.         c = pat[i]
  25.         i = i+1
  26.         if c == '*':
  27.             res = res + '.*'
  28.         elif c == '?':
  29.             res = res + '.'
  30.         elif c == '[':
  31.             j = i
  32.             if j < n and pat[j] == '!':
  33.                 j = j+1
  34.             if j < n and pat[j] == ']':
  35.                 j = j+1
  36.             while j < n and pat[j] != ']':
  37.                 j = j+1
  38.             if j >= n:
  39.                 res = res + '\\['
  40.             else:
  41.                 stuff = pat[i:j]
  42.                 i = j+1
  43.                 if stuff[0] == '!':
  44.                     stuff = '[^' + stuff[1:] + ']'
  45.                 elif stuff == '^'*len(stuff):
  46.                     stuff = '\\^'
  47.                 else:
  48.                     while stuff[0] == '^':
  49.                         stuff = stuff[1:] + stuff[0]
  50.                     stuff = '[' + stuff + ']'
  51.                 res = res + stuff
  52.         elif c in '\\.+^$':
  53.             res = res + ('\\' + c)
  54.         else:
  55.             res = res + c
  56.     return res
  57.