Source

cpython-withatomic / Lib / fnmatch.py

# 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