Guido van Rossum | 762c39e | 1991-01-01 18:11:14 +0000 | [diff] [blame] | 1 | # module 'fnmatch' -- filename matching with shell patterns |
| 2 | |
Guido van Rossum | 762c39e | 1991-01-01 18:11:14 +0000 | [diff] [blame] | 3 | def fnmatch(name, pat): |
Guido van Rossum | fc61383 | 1991-04-07 13:40:02 +0000 | [diff] [blame] | 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) |
Guido van Rossum | 762c39e | 1991-01-01 18:11:14 +0000 | [diff] [blame] | 25 | |
| 26 | def fnmatch1(name, pat): |
| 27 | for i in range(len(pat)): |
| 28 | c = pat[i] |
| 29 | if c = '*': |
Guido van Rossum | fc61383 | 1991-04-07 13:40:02 +0000 | [diff] [blame] | 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 |
Guido van Rossum | 762c39e | 1991-01-01 18:11:14 +0000 | [diff] [blame] | 38 | elif c = '?': |
| 39 | if len(name) <= i : return 0 |
| 40 | elif c = '[': |
Guido van Rossum | fc61383 | 1991-04-07 13:40:02 +0000 | [diff] [blame] | 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:]) |
Guido van Rossum | 762c39e | 1991-01-01 18:11:14 +0000 | [diff] [blame] | 62 | else: |
| 63 | if name[i:i+1] <> c: |
| 64 | return 0 |
| 65 | return 1 |
| 66 | |
| 67 | def fnmatchlist(names, pat): |
| 68 | res = [] |
| 69 | for name in names: |
| 70 | if fnmatch(name, pat): res.append(name) |
| 71 | return res |