mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			41 lines
		
	
	
	
		
			893 B
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			41 lines
		
	
	
	
		
			893 B
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import re | ||
|  | 
 | ||
|  | 
 | ||
|  | def translate(pattern): | ||
|  |     r"""
 | ||
|  |     Given a glob pattern, produce a regex that matches it. | ||
|  | 
 | ||
|  |     >>> translate('*.txt') | ||
|  |     '[^/]*\\.txt' | ||
|  |     >>> translate('a?txt') | ||
|  |     'a.txt' | ||
|  |     >>> translate('**/*') | ||
|  |     '.*/[^/]*' | ||
|  |     """
 | ||
|  |     return ''.join(map(replace, separate(pattern))) | ||
|  | 
 | ||
|  | 
 | ||
|  | def separate(pattern): | ||
|  |     """
 | ||
|  |     Separate out character sets to avoid translating their contents. | ||
|  | 
 | ||
|  |     >>> [m.group(0) for m in separate('*.txt')] | ||
|  |     ['*.txt'] | ||
|  |     >>> [m.group(0) for m in separate('a[?]txt')] | ||
|  |     ['a', '[?]', 'txt'] | ||
|  |     """
 | ||
|  |     return re.finditer(r'([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)', pattern) | ||
|  | 
 | ||
|  | 
 | ||
|  | def replace(match): | ||
|  |     """
 | ||
|  |     Perform the replacements for a match from :func:`separate`. | ||
|  |     """
 | ||
|  | 
 | ||
|  |     return match.group('set') or ( | ||
|  |         re.escape(match.group(0)) | ||
|  |         .replace('\\*\\*', r'.*') | ||
|  |         .replace('\\*', r'[^/]*') | ||
|  |         .replace('\\?', r'.') | ||
|  |     ) |