Updated for 2.1a3
[python/dscho.git] / Lib / fnmatch.py
blobc40f50035dcf9f8583c2a6e56c94749f7f2ceaf3
1 """Filename matching with shell patterns.
3 fnmatch(FILENAME, PATTERN) matches according to the local convention.
4 fnmatchcase(FILENAME, PATTERN) always takes case in account.
6 The functions operate by translating the pattern into a regular
7 expression. They cache the compiled regular expressions for speed.
9 The function translate(PATTERN) returns a regular expression
10 corresponding to PATTERN. (It does not compile it.)
11 """
13 import re
15 __all__ = ["fnmatch","fnmatchcase","translate"]
17 _cache = {}
19 def fnmatch(name, pat):
20 """Test whether FILENAME matches PATTERN.
22 Patterns are Unix shell style:
24 * matches everything
25 ? matches any single character
26 [seq] matches any character in seq
27 [!seq] matches any char not in seq
29 An initial period in FILENAME is not special.
30 Both FILENAME and PATTERN are first case-normalized
31 if the operating system requires it.
32 If you don't want this, use fnmatchcase(FILENAME, PATTERN).
33 """
35 import os
36 name = os.path.normcase(name)
37 pat = os.path.normcase(pat)
38 return fnmatchcase(name, pat)
40 def fnmatchcase(name, pat):
41 """Test whether FILENAME matches PATTERN, including case.
43 This is a version of fnmatch() which doesn't case-normalize
44 its arguments.
45 """
47 if not _cache.has_key(pat):
48 res = translate(pat)
49 _cache[pat] = re.compile(res)
50 return _cache[pat].match(name) is not None
52 def translate(pat):
53 """Translate a shell PATTERN to a regular expression.
55 There is no way to quote meta-characters.
56 """
58 i, n = 0, len(pat)
59 res = ''
60 while i < n:
61 c = pat[i]
62 i = i+1
63 if c == '*':
64 res = res + '.*'
65 elif c == '?':
66 res = res + '.'
67 elif c == '[':
68 j = i
69 if j < n and pat[j] == '!':
70 j = j+1
71 if j < n and pat[j] == ']':
72 j = j+1
73 while j < n and pat[j] != ']':
74 j = j+1
75 if j >= n:
76 res = res + '\\['
77 else:
78 stuff = pat[i:j]
79 i = j+1
80 if stuff[0] == '!':
81 stuff = '[^' + stuff[1:] + ']'
82 elif stuff == '^'*len(stuff):
83 stuff = '\\^'
84 else:
85 while stuff[0] == '^':
86 stuff = stuff[1:] + stuff[0]
87 stuff = '[' + stuff + ']'
88 res = res + stuff
89 else:
90 res = res + re.escape(c)
91 return res + "$"