Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
grumpy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
grumpy
Commits
23140d0c
Commit
23140d0c
authored
Jan 17, 2017
by
YOU
Committed by
Dylan Trotter
Jan 17, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add fnmatch module to stdlib (#141)
parent
44c519ff
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
125 additions
and
0 deletions
+125
-0
third_party/stdlib/fnmatch.py
third_party/stdlib/fnmatch.py
+125
-0
No files found.
third_party/stdlib/fnmatch.py
0 → 100644
View file @
23140d0c
"""Filename matching with shell patterns.
fnmatch(FILENAME, PATTERN) matches according to the local convention.
fnmatchcase(FILENAME, PATTERN) always takes case in account.
The functions operate by translating the pattern into a regular
expression. They cache the compiled regular expressions for speed.
The function translate(PATTERN) returns a regular expression
corresponding to PATTERN. (It does not compile it.)
"""
import
re
__all__
=
[
"filter"
,
"fnmatch"
,
"fnmatchcase"
,
"translate"
]
_cache
=
{}
_MAXCACHE
=
100
def
_purge
():
"""Clear the pattern cache"""
# _cache.clear()
globals
()[
'_cache'
]
=
{}
def
fnmatch
(
name
,
pat
):
"""Test whether FILENAME matches PATTERN.
Patterns are Unix shell style:
* matches everything
? matches any single character
[seq] matches any character in seq
[!seq] matches any char not in seq
An initial period in FILENAME is not special.
Both FILENAME and PATTERN are first case-normalized
if the operating system requires it.
If you don't want this, use fnmatchcase(FILENAME, PATTERN).
"""
# import os
# name = os.path.normcase(name)
# pat = os.path.normcase(pat)
return
fnmatchcase
(
name
,
pat
)
def
filter
(
names
,
pat
):
"""Return the subset of the list NAMES that match PAT"""
import
os
# import posixpath
result
=
[]
# pat=os.path.normcase(pat)
try
:
re_pat
=
_cache
[
pat
]
except
KeyError
:
res
=
translate
(
pat
)
if
len
(
_cache
)
>=
_MAXCACHE
:
# _cache.clear()
globals
()[
'_cache'
]
=
{}
_cache
[
pat
]
=
re_pat
=
re
.
compile
(
res
)
match
=
re_pat
.
match
# if os.path is posixpath:
if
1
:
# normcase on posix is NOP. Optimize it away from the loop.
for
name
in
names
:
if
match
(
name
):
result
.
append
(
name
)
else
:
for
name
in
names
:
if
match
(
os
.
path
.
normcase
(
name
)):
result
.
append
(
name
)
return
result
def
fnmatchcase
(
name
,
pat
):
"""Test whether FILENAME matches PATTERN, including case.
This is a version of fnmatch() which doesn't case-normalize
its arguments.
"""
try
:
re_pat
=
_cache
[
pat
]
except
KeyError
:
res
=
translate
(
pat
)
if
len
(
_cache
)
>=
_MAXCACHE
:
# _cache.clear()
globals
()[
'_cache'
]
=
{}
_cache
[
pat
]
=
re_pat
=
re
.
compile
(
res
)
return
re_pat
.
match
(
name
)
is
not
None
def
translate
(
pat
):
"""Translate a shell PATTERN to a regular expression.
There is no way to quote meta-characters.
"""
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
].
replace
(
'
\
\
'
,
'
\
\
\
\
'
)
i
=
j
+
1
if
stuff
[
0
]
==
'!'
:
stuff
=
'^'
+
stuff
[
1
:]
elif
stuff
[
0
]
==
'^'
:
stuff
=
'
\
\
'
+
stuff
res
=
'%s[%s]'
%
(
res
,
stuff
)
else
:
res
=
res
+
re
.
escape
(
c
)
return
res
+
'
\
Z(?ms)
'
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment