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.)
15 __all__
= ["fnmatch","fnmatchcase","translate"]
19 def fnmatch(name
, pat
):
20 """Test whether FILENAME matches PATTERN.
22 Patterns are Unix shell style:
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).
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
47 if not _cache
.has_key(pat
):
49 _cache
[pat
] = re
.compile(res
)
50 return _cache
[pat
].match(name
) is not None
53 """Translate a shell PATTERN to a regular expression.
55 There is no way to quote meta-characters.
69 if j
< n
and pat
[j
] == '!':
71 if j
< n
and pat
[j
] == ']':
73 while j
< n
and pat
[j
] != ']':
81 stuff
= '[^' + stuff
[1:] + ']'
82 elif stuff
== '^'*len(stuff
):
85 while stuff
[0] == '^':
86 stuff
= stuff
[1:] + stuff
[0]
87 stuff
= '[' + stuff
+ ']'
90 res
= res
+ re
.escape(c
)