blob: 1e7dbb31889129343c8a4b9017613a1246de5ca8 [file] [log] [blame]
Guido van Rossum762c39e1991-01-01 18:11:14 +00001# module 'fnmatch' -- filename matching with shell patterns
2
Guido van Rossum762c39e1991-01-01 18:11:14 +00003def fnmatch(name, pat):
Guido van Rossumfc613831991-04-07 13:40:02 +00004 #
5 # Check for simple case: no special characters
6 #
7 if not ('*' in pat or '?' in pat or '[' in pat):
8 return name = pat
9 #
10 # Check for common cases: *suffix and prefix*
11 #
12 if pat[0] = '*':
13 p1 = pat[1:]
14 if not ('*' in p1 or '?' in p1 or '[' in p1):
15 start = len(name) - len(p1)
16 return start >= 0 and name[start:] = p1
17 elif pat[-1:] = '*':
18 p1 = pat[:-1]
19 if not ('*' in p1 or '?' in p1 or '[' in p1):
20 return name[:len(p1)] = p1
21 #
22 # General case
23 #
24 return fnmatch1(name, pat)
Guido van Rossum762c39e1991-01-01 18:11:14 +000025
26def fnmatch1(name, pat):
27 for i in range(len(pat)):
28 c = pat[i]
29 if c = '*':
Guido van Rossumfc613831991-04-07 13:40:02 +000030 p1 = pat[i+1:]
31 if not ('*' in p1 or '?' in p1 or '[' in p1):
32 start = len(name) - len(p1)
33 return start >= 0 and name[start:] = p1
34 for i in range(i, len(name) + 1):
35 if fnmatch1(name[i:], p1):
36 return 1
37 return 0
Guido van Rossum762c39e1991-01-01 18:11:14 +000038 elif c = '?':
39 if len(name) <= i : return 0
40 elif c = '[':
Guido van Rossumfc613831991-04-07 13:40:02 +000041 c, rest = name[i], name[i+1:]
42 i, n = i+1, len(pat) - 1
43 match = 0
44 exclude = 0
45 if i < n and pat[i] = '!':
46 exclude = 1
47 i = i+1
48 while i < n:
49 if pat[i] = c: match = 1
50 i = i+1
51 if i >= n or pat[i] = ']':
52 break
53 if pat[i] = '-':
54 i = i+1
55 if i >= n or pat[i] = ']':
56 break
57 match = (pat[i-2] <= c <= pat[i])
58 i = i+1
59 if match = exclude:
60 return 0
61 return fnmatch1(rest, pat[i+1:])
Guido van Rossum762c39e1991-01-01 18:11:14 +000062 else:
63 if name[i:i+1] <> c:
64 return 0
65 return 1
66
67def fnmatchlist(names, pat):
68 res = []
69 for name in names:
70 if fnmatch(name, pat): res.append(name)
71 return res