fnmatch — Соответствие шаблону имени файла Unix


Данный модуль обеспечивает поддержку подстановочных знаков в стиле оболочки Unix, которые не являются регулярными выражениями (задокументированы в модуле re). В подстановочных знаках в стиле оболочки используются специальные символы:

Шаблон Значение
* соответствует всему
? соответствует любому единичному символу
[seq] соответствует любому символу в seq
[!seq] соответствует любому символу не в seq

Для буквального соответствия заключите метасимволы в скобки. Например, '[?]' соответствует символу '?'.

Обратите внимание, что разделитель имён файлов ('/' в Unix) не является специальным для данного модуля. См. модуль glob для расширения пути (glob использует filter() для соответствия сегментам пути). Точно так же имена файлов, начинающиеся с точки, не являются специальными для этого модуля и соответствуют шаблонам * и ?.

fnmatch.fnmatch(filename, pattern)

Проверяет, соответствует ли строка filename строке pattern, возвращая True или False. Оба параметра нормализованы по регистру с использованием os.path.normcase(). fnmatchcase() можно использовать для сравнения с учётом регистра, независимо от того, является ли это стандартом для операционной системы.

В этом примере будут напечатаны все имена файлов в текущем каталоге с расширением .txt:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
fnmatch.fnmatchcase(filename, pattern)

Проверяет, соответствует ли filename pattern, возвращая True или False; сравнение чувствительно к регистру и не применяется os.path.normcase().

fnmatch.filter(names, pattern)

Создаёт список из тех элементов итерируемого names, которые соответствуют pattern. Он такой же, как [n for n in names if fnmatch(n, pattern)], но реализован более эффективно.

fnmatch.translate(pattern)

Возвращает pattern в стиле оболочки, преобразованный в регулярное выражение для использования с re.match().

Пример:

>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\Z'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>

См.также

Модуль glob
Расширение пути в стиле оболочки Unix.