| # 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 |