fnmatch --- تطبیق الگوی نام‌پرونده یونیکس

کد منبع: Lib/fnmatch.py


این ماژول از وایلدکارد به‌سبک پوسته یونیکس پشتیبانی می‌کند، که با عبارات باقاعده (که در ماژول re مستند شده‌اند) یکسان نیستند. نویسه‌های ویژه استفاده‌شده در وایلدکارد به‌سبک پوسته عبارتند از:

الگو

معنی

*

با همه‌چیز مطابقت دارد

?

با هر نویسه‌ی منفرد تطابق دارد

[seq]

با هر نویسه‌ای در seq مطابقت می‌کند

[!seq]

با هر نویسه‌ای که در seq نباشد، مطابقت می‌کند

برای تطبیق لفظی، فرانویسه‌ها را در براکت قرار دهید. برای مثال، '[?]' با نویسه‌ی '?' مطابقت دارد.

توجه داشته باشید که جداکننده نام پرونده ('/' در یونیکس) برای این ماژول ویژه نیست. برای بسط مسیر، ماژول glob را ببینید (glob از filter() برای تطبیق بخش‌های مسیر استفاده می‌کند). به‌طور مشابه، پرونده‌هایی که نامشان با یک نقطه شروع می‌شود، برای این ماژول ویژه نیستند و با الگوهای * و ? تطبیق داده می‌شوند.

مگر آنکه خلاف آن ذکر شده باشد، «رشته‌ی نام پرونده» و «رشته‌ی الگو» هر یک به اشیای str یا اشیای bytes کدگذاری‌شده با ISO-8859-1 اشاره دارند. توجه داشته باشید که توابع مستندشده در زیر اجازه نمی‌دهند یک الگوی bytes را با یک نام پرونده str ترکیب کنید، و برعکس.

در نهایت، توجه داشته باشید که @functools.lru_cache با maxsize برابر ۳۲۷۶۸ برای نهانگاه‌سازی الگوهای regex کامپایل‌شده (تایپ‌شده) در توابع زیر استفاده می‌شود: fnmatch()، fnmatchcase()، filter()، filterfalse().

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)

فهرستی از آن عناصرِ پیمایش‌پذیر names از رشته‌های نام پرونده که با رشته‌ی الگو pat مطابقت دارند، می‌سازد. این معادل [n for n in names if fnmatch(n, pat)] است، اما به‌صورت کارآمدتری پیاده‌سازی شده است.

fnmatch.filterfalse(names, pat)

فهرستی از آن عناصر پیمایش‌پذیر از رشته‌های نام پرونده names می‌سازد که با رشته‌ی الگو pat مطابقت ندارند. این معادل [n for n in names if not fnmatch(n, pat)] است، اما به‌صورت کارآمدتری پیاده‌سازی شده است.

اضافه شده در نسخه‌ی 3.14.

fnmatch.translate(pat)

الگوی سبک پوسته pat را به‌صورت یک عبارت باقاعده برای استفاده با re.match() برمی‌گرداند. انتظار می‌رود الگو یک str باشد.

مثال:

>>> 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

بسط مسیر به سبک پوسته‌ی یونیکس.