Skip to content

Commit fc61383

Browse files
committed
Support [...] ranges. Also [!...] for negated ranges, SYSV shell style.
1 parent 117dbcb commit fc61383

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

Lib/fnmatch.py

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,64 @@
11
# module 'fnmatch' -- filename matching with shell patterns
22

3-
# XXX [] patterns are not supported (but recognized)
4-
53
def fnmatch(name, pat):
6-
if '*' in pat or '?' in pat or '[' in pat:
7-
return fnmatch1(name, pat)
8-
return name = pat
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)
925

1026
def fnmatch1(name, pat):
1127
for i in range(len(pat)):
1228
c = pat[i]
1329
if c = '*':
14-
restpat = pat[i+1:]
15-
if '*' in restpat or '?' in restpat or '[' in restpat:
16-
for i in range(i, len(name)):
17-
if fnmatch1(name[i:], restpat):
18-
return 1
19-
return 0
20-
else:
21-
return name[len(name)-len(restpat):] = restpat
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
2238
elif c = '?':
2339
if len(name) <= i : return 0
2440
elif c = '[':
25-
return 0 # XXX
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:])
2662
else:
2763
if name[i:i+1] <> c:
2864
return 0

0 commit comments

Comments
 (0)