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

Исходный код: Lib/fnmatch.py


Этот модуль обеспечивает поддержку подстановочных знаков в стиле оболочки 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.