mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			56 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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
 |