> **Источник:** https://python-all.ru/3.1/library/fnmatch.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 10.7. `fnmatch` – сопоставление имен файлов в стиле Unix

Этот модуль обеспечивает поддержку подстановочных знаков в стиле оболочки Unix, которые *не* являются тем же, что и регулярные выражения (документированные в модуле [`re`](https://python-all.ru/3.1/library/re.html#module-re)). Специальные символы, используемые в подстановочных знаках в стиле оболочки:

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

Обратите внимание, что разделитель имен файлов (`'/'` в Unix) *не* является специальным для этого модуля. См. модуль [`glob`](https://python-all.ru/3.1/library/glob.html#module-glob) для расширения путей ([`glob`](https://python-all.ru/3.1/library/glob.html#module-glob) использует [`fnmatch()`](https://python-all.ru/3.1/library/fnmatch.html#fnmatch.fnmatch) для сопоставления сегментов путей). Аналогично, имена файлов, начинающиеся с точки, не являются специальными для этого модуля и сопоставляются с `*` и `?` шаблонами.

#### `fnmatch.fnmatch(filename, pattern)`

Проверяет, соответствует ли строка *filename* строке *pattern*, возвращая [`True`](https://python-all.ru/3.1/library/constants.html#True) или [`False`](https://python-all.ru/3.1/library/constants.html#False). Если операционная система нечувствительна к регистру, оба параметра будут приведены к нижнему или верхнему регистру перед выполнением сравнения. Для регистрозависимого сравнения можно использовать [`fnmatchcase()`](https://python-all.ru/3.1/library/fnmatch.html#fnmatch.fnmatchcase), независимо от того, является ли это стандартным для операционной системы.

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

```python
import fnmatch
import os

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

#### `fnmatch.fnmatchcase(filename, pattern)`

Проверяет, соответствует ли

*filename*

*pattern*

, возвращая

[`True`](https://python-all.ru/3.1/library/constants.html#True)

или

[`False`](https://python-all.ru/3.1/library/constants.html#False)

; сравнение чувствительно к регистру.

#### `fnmatch.filter(names, pattern)`

Возвращает подмножество списка

*names*

, которые соответствуют

*pattern*

. Это то же самое, что

`[n for n in names if fnmatch(n, pattern)]`

, но реализовано более эффективно.

#### `fnmatch.translate(pattern)`

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

Пример:

```python
>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'.*\\.txt$'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<_sre.SRE_Match object at 0x...>
```

> **См. также**
>
> **Модуль [`glob`](https://python-all.ru/3.1/library/glob.html#module-glob)**
>
> Раскрытие путей в стиле оболочки Unix.
