blob: 5c1bc711c11500cf280f70929d1c1cf10d334df9 [file] [log] [blame]
Guido van Rossum762c39e1991-01-01 18:11:14 +00001# module 'fnmatch' -- filename matching with shell patterns
Guido van Rossum05e52191992-01-12 23:29:29 +00002# This version translates the pattern to a regular expression
3# and moreover caches the expressions.
4
5import os
6import regex
7
8cache = {}
Guido van Rossum762c39e1991-01-01 18:11:14 +00009
Guido van Rossum762c39e1991-01-01 18:11:14 +000010def fnmatch(name, pat):
Guido van Rossum05e52191992-01-12 23:29:29 +000011 name = os.path.normcase(name)
12 pat = os.path.normcase(pat)
13 if not cache.has_key(pat):
14 res = translate(pat)
15 save_syntax = regex.set_syntax(0)
16 cache[pat] = regex.compile(res)
17 save_syntax = regex.set_syntax(save_syntax)
18 return cache[pat].match(name) == len(name)
Guido van Rossum762c39e1991-01-01 18:11:14 +000019
Guido van Rossum05e52191992-01-12 23:29:29 +000020def translate(pat):
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000021 i, n = 0, len(pat)
Guido van Rossum05e52191992-01-12 23:29:29 +000022 res = ''
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000023 while i < n:
Guido van Rossum762c39e1991-01-01 18:11:14 +000024 c = pat[i]
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000025 i = i+1
Guido van Rossum05e52191992-01-12 23:29:29 +000026 if c == '*':
27 res = res + '.*'
28 elif c == '?':
29 res = res + '.'
30 elif c == '[':
31 j = i
32 if j < n and pat[j] == '!':
33 j = j+1
34 if j < n and pat[j] == ']':
35 j = j+1
36 while j < n and pat[j] != ']':
37 j = j+1
38 if j >= n:
39 res = res + '\\['
40 else:
41 stuff = pat[i:j]
42 i = j+1
43 if stuff[0] == '!':
44 stuff = '[^' + stuff[1:] + ']'
45 elif stuff == '^'*len(stuff):
46 stuff = '\\^'
47 else:
48 while stuff[0] == '^':
49 stuff = stuff[1:] + stuff[0]
50 stuff = '[' + stuff + ']'
51 res = res + stuff
52 elif c in '\\.+^$':
53 res = res + ('\\' + c)
54 else:
55 res = res + c
Guido van Rossum762c39e1991-01-01 18:11:14 +000056 return res