fnmatch – Unix filename pattern matching in Python
Last Updated :
22 Nov, 2020
This module is used for matching Unix shell-style wildcards. fnmatch() compares a single file name against a pattern and returns TRUE if they match else returns FALSE.
The comparison is case-sensitive when the operating system uses a case-sensitive file system.
The special characters and their functions used in shell-style wildcards are :
- ‘*’ – matches everything
- ‘?’ – matches any single character
- ‘[seq]’ – matches any character in seq
- ‘[!seq]’ – matches any character not in seq
The meta-characters should be wrapped in brackets for a literal match. For example, ‘[?]’ matches the character ‘?’.
Functions provided by the fnmatch module
- fnmatch.fnmatch(filename, pattern): This function tests whether the given filename string matches the pattern string and returns a boolean value. If the operating system is case-insensitive, then both parameters will be normalized to all lower-case or upper-case before the comparison is performed.
Example: Script to search all files starting with ‘fnmatch’ and ending in ‘.py’
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))
|
Output :
$ 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
- fnmatch.fnmatchcase(filename, pattern): This function performs the case sensitive comparison and tests whether the given filename string matches the pattern string and returns a boolean value.
Example: Script for a case-sensitive comparison, regardless of the filesystem and operating system settings.
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)))
|
Output :
$ python fnmatch_fnmatchcase.py
Pattern : FNMATCH_*.PY
Filename: __init__.py False
Filename: fnmatch_filter.py False
Filename: FNMATCH_FNMATCH.PY True
Filename: fnmatch_fnmatchcase.py False
Filename: fnmatch_translate.py False
Filename: index.rst False
- fnmatch.filter(names, pattern): This function returns the subset of the list of names passed in the function that match the given pattern.
Example: Filter files by more than one file extension.
import fnmatch
import os
pattern = 'fnmatch_*.py'
print ( 'Pattern :' , pattern )
files = os.listdir( '.' )
print ( 'Files :' , files)
print ( 'Matches :' , fnmatch. filter (files, pattern))
|
Output :
$ 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']
- fnmatch.translate(pattern): This function returns the shell-style pattern converted to a regular expression for using with re.match() (re.match() will only match at the beginning of the string and not at the beginning of each line).
import fnmatch, re
regex = fnmatch.translate( '*.txt' )
reobj = re. compile (regex)
print (regex)
print (reobj.match( 'foobar.txt' ))
|
Output :
'(?s:.*\\.txt)\\Z'
_sre.SRE_Match object; span=(0, 10), match='foobar.txt'
Share your thoughts in the comments
Please Login to comment...