fnmatch — Сопоставление образцов имен файлов Unix

Источник: Lib/fnmatch.py


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

Узор

Значение

*

подходит ко всему

?

соответствует любому одиночному символу

[seq]

соответствует любому символу в seq.

[!seq]

соответствует любому символу, не входящему в seq.

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

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

Также обратите внимание, что functools.lru_cache() с maxsize, равным 32768, используется для кэширования скомпилированных шаблонов regex в следующих функциях: fnmatch(), fnmatchcase(), filter().

fnmatch.fnmatch(name, pat)

Проверяет, соответствует ли строка имени файла name строке шаблона pat, возвращая 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(name, pat)

Проверяет, соответствует ли строка имени файла name строке шаблона pat, возвращая True или False; сравнение чувствительно к регистру и не применяется os.path.normcase().

fnmatch.filter(names, pat)

Постройте список из тех элементов iterable имена, которые соответствуют шаблону pat. Это то же самое, что и [n for n in names if fnmatch(n, pat)], но реализовано более эффективно.

fnmatch.translate(pat)

Возвращает шаблон в стиле shell pat, преобразованный в регулярное выражение для использования с 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.