summaryrefslogtreecommitdiffstats
path: root/Lib/fnmatch.py
blob: 5c1bc711c11500cf280f70929d1c1cf10d334df9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 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