57 lines
1.2 KiB
Python
57 lines
1.2 KiB
Python
# module 'fnmatch' -- filename matching with shell patterns
|
|
# This version translates the pattern to a regular expression
|
|
# and moreover caches the expressions.
|
|
|
|
import os
|
|
import regex
|
|
|
|
cache = {}
|
|
|
|
def fnmatch(name, pat):
|
|
name = os.path.normcase(name)
|
|
pat = os.path.normcase(pat)
|
|
if not cache.has_key(pat):
|
|
res = translate(pat)
|
|
save_syntax = regex.set_syntax(0)
|
|
cache[pat] = regex.compile(res)
|
|
save_syntax = regex.set_syntax(save_syntax)
|
|
return cache[pat].match(name) == len(name)
|
|
|
|
def translate(pat):
|
|
i, n = 0, len(pat)
|
|
res = ''
|
|
while i < n:
|
|
c = pat[i]
|
|
i = i+1
|
|
if c == '*':
|
|
res = res + '.*'
|
|
elif c == '?':
|
|
res = res + '.'
|
|
elif c == '[':
|
|
j = i
|
|
if j < n and pat[j] == '!':
|
|
j = j+1
|
|
if j < n and pat[j] == ']':
|
|
j = j+1
|
|
while j < n and pat[j] != ']':
|
|
j = j+1
|
|
if j >= n:
|
|
res = res + '\\['
|
|
else:
|
|
stuff = pat[i:j]
|
|
i = j+1
|
|
if stuff[0] == '!':
|
|
stuff = '[^' + stuff[1:] + ']'
|
|
elif stuff == '^'*len(stuff):
|
|
stuff = '\\^'
|
|
else:
|
|
while stuff[0] == '^':
|
|
stuff = stuff[1:] + stuff[0]
|
|
stuff = '[' + stuff + ']'
|
|
res = res + stuff
|
|
elif c in '\\.+^$':
|
|
res = res + ('\\' + c)
|
|
else:
|
|
res = res + c
|
|
return res
|