mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			893 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			40 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'.')
 | |
|     )
 | 
