mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# module 'fnmatch' -- filename matching with shell patterns
 | 
						|
 | 
						|
def fnmatch(name, pat):
 | 
						|
	#
 | 
						|
	# Check for simple case: no special characters
 | 
						|
	#
 | 
						|
	if not ('*' in pat or '?' in pat or '[' in pat):
 | 
						|
		return name = pat
 | 
						|
	#
 | 
						|
	# Check for common cases: *suffix and prefix*
 | 
						|
	#
 | 
						|
	if pat[0] = '*':
 | 
						|
		p1 = pat[1:]
 | 
						|
		if not ('*' in p1 or '?' in p1 or '[' in p1):
 | 
						|
			start = len(name) - len(p1)
 | 
						|
			return start >= 0 and name[start:] = p1
 | 
						|
	elif pat[-1:] = '*':
 | 
						|
		p1 = pat[:-1]
 | 
						|
		if not ('*' in p1 or '?' in p1 or '[' in p1):
 | 
						|
			return name[:len(p1)] = p1
 | 
						|
	#
 | 
						|
	# General case
 | 
						|
	#
 | 
						|
	return fnmatch1(name, pat)
 | 
						|
 | 
						|
def fnmatch1(name, pat):
 | 
						|
	for i in range(len(pat)):
 | 
						|
		c = pat[i]
 | 
						|
		if c = '*':
 | 
						|
			p1 = pat[i+1:]
 | 
						|
			if not ('*' in p1 or '?' in p1 or '[' in p1):
 | 
						|
				start = len(name) - len(p1)
 | 
						|
				return start >= 0 and name[start:] = p1
 | 
						|
			for i in range(i, len(name) + 1):
 | 
						|
				if fnmatch1(name[i:], p1):
 | 
						|
					return 1
 | 
						|
			return 0
 | 
						|
		elif c = '?':
 | 
						|
			if len(name) <= i : return 0
 | 
						|
		elif c = '[':
 | 
						|
			c, rest = name[i], name[i+1:]
 | 
						|
			i, n = i+1, len(pat) - 1
 | 
						|
			match = 0
 | 
						|
			exclude = 0
 | 
						|
			if i < n and pat[i] = '!':
 | 
						|
				exclude = 1
 | 
						|
				i = i+1
 | 
						|
			while i < n:
 | 
						|
				if pat[i] = c: match = 1
 | 
						|
				i = i+1
 | 
						|
				if i >= n or pat[i] = ']':
 | 
						|
					break
 | 
						|
				if pat[i] = '-':
 | 
						|
					i = i+1
 | 
						|
					if i >= n or pat[i] = ']':
 | 
						|
						break
 | 
						|
					match = (pat[i-2] <= c <= pat[i])
 | 
						|
					i = i+1
 | 
						|
			if match = exclude:
 | 
						|
				return 0
 | 
						|
			return fnmatch1(rest, pat[i+1:])
 | 
						|
		else:
 | 
						|
			if name[i:i+1] <> c:
 | 
						|
				return 0
 | 
						|
	return 1
 | 
						|
 | 
						|
def fnmatchlist(names, pat):
 | 
						|
	res = []
 | 
						|
	for name in names:
 | 
						|
		if fnmatch(name, pat): res.append(name)
 | 
						|
	return res
 |