Open In App

fnmatch – Unix filename pattern matching in Python

Last Updated : 22 Nov, 2020
Improve
Improve
Like Article
Like
Save
Share
Report

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

  1. 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’




    # Python program to illustrate 
    # fnmatch.fnmatch(filename, pattern) 
    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
    
  2. 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.




    # Python program to illustrate 
    # fnmatch.fnmatchcase(filename, pattern) 
    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
    
  3. 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.




    # Python program to illustrate 
    # fnmatch.filter(names, pattern) 
    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']
    
  4. 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).




    # Python program to illustrate 
    # fnmatch.translate(pattern) 
    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'
    


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads