fnmatch – Compare filenames against Unix-style glob patterns.¶
|Purpose:||Handle Unix-style filename comparison with the fnmatch module.|
|Available In:||1.4 and later.|
The fnmatch module is used to compare filenames against glob-style patterns such as used by Unix shells.
fnmatch() compares a single filename against a pattern and returns a boolean indicating whether or not they match. The comparison is case-sensitive when the operating system uses a case-sensitive filesystem.
import fnmatch import os pattern = 'fnmatch_*.py' print 'Pattern :', pattern print files = os.listdir('.') for name in files: print 'Filename: %-25s %s' % (name, fnmatch.fnmatch(name, pattern))
In this example, the pattern matches all files starting with ‘fnmatch‘ and ending in ‘.py’.
$ python fnmatch_fnmatch.py Pattern : fnmatch_*.py Filename: __init__.py False Filename: fnmatch_filter.py True Filename: fnmatch_fnmatch.py True Filename: fnmatch_fnmatchcase.py True Filename: fnmatch_translate.py True Filename: index.rst False
To force a case-sensitive comparison, regardless of the filesystem and operating system settings, use fnmatchcase().
import fnmatch import os pattern = 'FNMATCH_*.PY' print 'Pattern :', pattern print files = os.listdir('.') for name in files: print 'Filename: %-25s %s' % (name, fnmatch.fnmatchcase(name, pattern))
Since my laptop uses a case-sensitive filesystem, no files match the modified pattern.
$ python fnmatch_fnmatchcase.py Pattern : FNMATCH_*.PY Filename: __init__.py False Filename: fnmatch_filter.py False Filename: fnmatch_fnmatch.py False Filename: fnmatch_fnmatchcase.py False Filename: fnmatch_translate.py False Filename: index.rst False
To test a sequence of filenames, you can use filter(). It returns a list of the names that match the pattern argument.
import fnmatch import os pattern = 'fnmatch_*.py' print 'Pattern :', pattern files = os.listdir('.') print 'Files :', files print 'Matches :', fnmatch.filter(files, pattern)
In this example, filter() returns the list of names of the example source files associated with this post.
$ python fnmatch_filter.py Pattern : fnmatch_*.py Files : ['__init__.py', 'fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py', 'index.rst'] Matches : ['fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py']
Internally, fnmatch converts the glob pattern to a regular expression and uses the re module to compare the name and pattern. The translate() function is the public API for converting glob patterns to regular expressions.
import fnmatch pattern = 'fnmatch_*.py' print 'Pattern :', pattern print 'Regex :', fnmatch.translate(pattern)
Notice that some of the characters are escaped to make a valid expression.
$ python fnmatch_translate.py Pattern : fnmatch_*.py Regex : fnmatch\_.*\.py\Z(?ms)