Документация Python неофициальный перевод

11.8. fnmatch – сопоставление имен файлов по шаблону Unixfnmatch – Unix filename pattern matching

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


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

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

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

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

fnmatch.fnmatch(filename, pattern)

Проверяет, соответствует ли строка filename строке pattern, возвращая True или False. Если операционная система нечувствительна к регистру, оба параметра будут приведены к нижнему или верхнему регистру перед выполнением сравнения. Для регистрозависимого сравнения можно использовать 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; сравнение чувствительно к регистру.

fnmatch.filter(names, pattern)

Возвращает подмножество списка names, которые соответствуют pattern. Это то же самое, что [n for n in names if fnmatch(n, pattern)], но реализовано более эффективно.

fnmatch.translate(pattern)

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

Пример:

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

См. также

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