Mercurial > cpython-lru_cache-weakref
annotate Lib/fnmatch.py @ 79675:c0a2294de787 2.7
Issue #16199: Backport 2to3 typo fix from 3.2.
| author | Chris Jerdonek <chris.jerdonek@gmail.com> |
|---|---|
| date | Thu, 11 Oct 2012 16:15:46 -0700 |
| parents | dab286d2ba82 |
| children |
| rev | line source |
|---|---|
| 2260 | 1 """Filename matching with shell patterns. |
| 2 | |
| 3 fnmatch(FILENAME, PATTERN) matches according to the local convention. | |
| 4 fnmatchcase(FILENAME, PATTERN) always takes case in account. | |
| 573 | 5 |
| 2260 | 6 The functions operate by translating the pattern into a regular |
| 7 expression. They cache the compiled regular expressions for speed. | |
| 573 | 8 |
| 2260 | 9 The function translate(PATTERN) returns a regular expression |
| 10 corresponding to PATTERN. (It does not compile it.) | |
| 11 """ | |
| 12 | |
|
6519
24da035ceb6e
Convert all remaining *simple* cases of regex usage to re usage.
Guido van Rossum <guido@python.org>
parents:
2260
diff
changeset
|
13 import re |
|
24da035ceb6e
Convert all remaining *simple* cases of regex usage to re usage.
Guido van Rossum <guido@python.org>
parents:
2260
diff
changeset
|
14 |
|
62924
dab286d2ba82
Merged revisions 82766 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
62887
diff
changeset
|
15 __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] |
| 16072 | 16 |
| 2260 | 17 _cache = {} |
|
62887
585c70dc1eaa
Merged revisions 82730 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
57038
diff
changeset
|
18 _MAXCACHE = 100 |
| 106 | 19 |
|
62924
dab286d2ba82
Merged revisions 82766 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
62887
diff
changeset
|
20 def _purge(): |
|
dab286d2ba82
Merged revisions 82766 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
62887
diff
changeset
|
21 """Clear the pattern cache""" |
|
dab286d2ba82
Merged revisions 82766 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
62887
diff
changeset
|
22 _cache.clear() |
|
dab286d2ba82
Merged revisions 82766 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
62887
diff
changeset
|
23 |
| 106 | 24 def fnmatch(name, pat): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
25 """Test whether FILENAME matches PATTERN. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
26 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
27 Patterns are Unix shell style: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
28 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
29 * matches everything |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
30 ? matches any single character |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
31 [seq] matches any character in seq |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
32 [!seq] matches any char not in seq |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
33 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
34 An initial period in FILENAME is not special. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
35 Both FILENAME and PATTERN are first case-normalized |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
36 if the operating system requires it. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
37 If you don't want this, use fnmatchcase(FILENAME, PATTERN). |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
38 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
39 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
40 import os |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
41 name = os.path.normcase(name) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
42 pat = os.path.normcase(pat) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
43 return fnmatchcase(name, pat) |
| 2260 | 44 |
|
18040
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
45 def filter(names, pat): |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
46 """Return the subset of the list NAMES that match PAT""" |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
47 import os,posixpath |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
48 result=[] |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
49 pat=os.path.normcase(pat) |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
18040
diff
changeset
|
50 if not pat in _cache: |
|
18040
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
51 res = translate(pat) |
|
62887
585c70dc1eaa
Merged revisions 82730 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
57038
diff
changeset
|
52 if len(_cache) >= _MAXCACHE: |
|
585c70dc1eaa
Merged revisions 82730 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
57038
diff
changeset
|
53 _cache.clear() |
|
18040
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
54 _cache[pat] = re.compile(res) |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
55 match=_cache[pat].match |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
56 if os.path is posixpath: |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
57 # normcase on posix is NOP. Optimize it away from the loop. |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
58 for name in names: |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
59 if match(name): |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
60 result.append(name) |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
61 else: |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
62 for name in names: |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
63 if match(os.path.normcase(name)): |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
64 result.append(name) |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
65 return result |
|
fb93dfbd8052
Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents:
17107
diff
changeset
|
66 |
| 2260 | 67 def fnmatchcase(name, pat): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
68 """Test whether FILENAME matches PATTERN, including case. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
69 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
70 This is a version of fnmatch() which doesn't case-normalize |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
71 its arguments. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
72 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
73 |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
18040
diff
changeset
|
74 if not pat in _cache: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
75 res = translate(pat) |
|
62887
585c70dc1eaa
Merged revisions 82730 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
57038
diff
changeset
|
76 if len(_cache) >= _MAXCACHE: |
|
585c70dc1eaa
Merged revisions 82730 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
57038
diff
changeset
|
77 _cache.clear() |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
78 _cache[pat] = re.compile(res) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
79 return _cache[pat].match(name) is not None |
| 106 | 80 |
| 573 | 81 def translate(pat): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
82 """Translate a shell PATTERN to a regular expression. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
83 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
84 There is no way to quote meta-characters. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
85 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
86 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
87 i, n = 0, len(pat) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
88 res = '' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
89 while i < n: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
90 c = pat[i] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
91 i = i+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
92 if c == '*': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
93 res = res + '.*' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
94 elif c == '?': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
95 res = res + '.' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
96 elif c == '[': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
97 j = i |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
98 if j < n and pat[j] == '!': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
99 j = j+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
100 if j < n and pat[j] == ']': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
101 j = j+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
102 while j < n and pat[j] != ']': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
103 j = j+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
104 if j >= n: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
105 res = res + '\\[' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
106 else: |
|
17107
adc8a41bee9f
Donovan Baarda <abo@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16072
diff
changeset
|
107 stuff = pat[i:j].replace('\\','\\\\') |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
108 i = j+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
109 if stuff[0] == '!': |
|
17107
adc8a41bee9f
Donovan Baarda <abo@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16072
diff
changeset
|
110 stuff = '^' + stuff[1:] |
|
adc8a41bee9f
Donovan Baarda <abo@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16072
diff
changeset
|
111 elif stuff[0] == '^': |
|
adc8a41bee9f
Donovan Baarda <abo@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16072
diff
changeset
|
112 stuff = '\\' + stuff |
|
adc8a41bee9f
Donovan Baarda <abo@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16072
diff
changeset
|
113 res = '%s[%s]' % (res, stuff) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
114 else: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
13050
diff
changeset
|
115 res = res + re.escape(c) |
|
57038
93c7f650937f
Merged revisions 74475 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
29847
diff
changeset
|
116 return res + '\Z(?ms)' |
