|
1 | 1 | # module 'fnmatch' -- filename matching with shell patterns |
2 | 2 |
|
3 | | -# XXX [] patterns are not supported (but recognized) |
4 | | - |
5 | 3 | def fnmatch(name, pat): |
6 | | - if '*' in pat or '?' in pat or '[' in pat: |
7 | | - return fnmatch1(name, pat) |
8 | | - return name = pat |
| 4 | + # |
| 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) |
9 | 25 |
|
10 | 26 | def fnmatch1(name, pat): |
11 | 27 | for i in range(len(pat)): |
12 | 28 | c = pat[i] |
13 | 29 | if c = '*': |
14 | | - restpat = pat[i+1:] |
15 | | - if '*' in restpat or '?' in restpat or '[' in restpat: |
16 | | - for i in range(i, len(name)): |
17 | | - if fnmatch1(name[i:], restpat): |
18 | | - return 1 |
19 | | - return 0 |
20 | | - else: |
21 | | - return name[len(name)-len(restpat):] = restpat |
| 30 | + 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 |
22 | 38 | elif c = '?': |
23 | 39 | if len(name) <= i : return 0 |
24 | 40 | elif c = '[': |
25 | | - return 0 # XXX |
| 41 | + 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:]) |
26 | 62 | else: |
27 | 63 | if name[i:i+1] <> c: |
28 | 64 | return 0 |
|
0 commit comments