| # module 'fnmatch' -- filename matching with shell patterns |
| # This version translates the pattern to a regular expression |
| # and moreover caches the expressions. |
| |
| import os |
| import regex |
| |
| cache = {} |
| |
| def fnmatch(name, pat): |
| name = os.path.normcase(name) |
| pat = os.path.normcase(pat) |
| if not cache.has_key(pat): |
| res = translate(pat) |
| save_syntax = regex.set_syntax(0) |
| cache[pat] = regex.compile(res) |
| save_syntax = regex.set_syntax(save_syntax) |
| return cache[pat].match(name) == len(name) |
| |
| def translate(pat): |
| 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] |
| i = j+1 |
| if stuff[0] == '!': |
| stuff = '[^' + stuff[1:] + ']' |
| elif stuff == '^'*len(stuff): |
| stuff = '\\^' |
| else: |
| while stuff[0] == '^': |
| stuff = stuff[1:] + stuff[0] |
| stuff = '[' + stuff + ']' |
| res = res + stuff |
| elif c in '\\.+^$': |
| res = res + ('\\' + c) |
| else: |
| res = res + c |
| return res |