На этом шаге мы рассмотрим возможности модуля fnmatch.
Вы хотите найти текст, используя те же маски, которые обычно применяются в оболочках Unix (например, *.py, Dat[0-9]*.csv и т. д.).
Модуль fnmatch предоставляет две функции: fnmatch() и fnmatchcase(), которые можно использовать для такого поиска. Все просто:
>>> from fnmatch import fnmatch, fnmatchcase >>> fnmatch('foo.txt', '*.txt') True >>> fnmatch('foo.txt', '?oo.txt') True >>> fnmatch('Dat45.csv', 'Dat[0-9]*') True >>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py'] >>> [name for name in names if fnmatch(name, 'Dat*.csv')] ['Dat1.csv', 'Dat2.csv'] >>>
По умолчанию fnmatch() использует те же чувствительные к регистру правила, что и файловая система текущей операционной системы (то есть правила меняются от системы к системе). Например:
>>> # On OS X (Mac) >>> fnmatch('foo.txt', '*.TXT') False >>> # On Windows >>> fnmatch('foo.txt', '*.TXT') True >>>
Если это различие важно, используйте метод fnmatchcase(). Он ищет именно такие совпадения заглавных и строчных букв, которые вы предоставите:
>>> fnmatchcase('foo.txt', '*.TXT') False
Часто упускается из вида возможность использования этих функций на строках, получаемых при обработке данных, или на строках, не являющихся именами файлов. Например, у вас есть список адресов:
>>> addresses = [ '5412 N CLARK ST', '1060 W ADDISON ST', '1039 W GRANVILLE AVE', '2122 N CLARK ST', '4802 N BROADWAY', ]
Вы можете написать такой генератор списка (list comprehension):
>>> from fnmatch import fnmatchcase >>> [addr for addr in addresses if fnmatchcase(addr, '* ST')] ['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST'] >>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')] ['5412 N CLARK ST'] >>>
Поиск совпадений с использованием fnmatch занимает нишу между возможностями простых строковых методов и полной мощью регулярных выражений. Если вам нужен простой механизм для применения масок в обработке данных, он часто будет подходящим решением.
Если же вы пишете код для поиска имен файлов, используйте модуль glob.
На следующем шаге мы рассмотрим поиск совпадений и поиск текстовых паттернов.