Функция fnmatch(). Phyton. Примеры использования в задачах
Функция fnmatch() модуля fnmatch проверяет, соответствует ли строка имени файла шаблонной строке, возвращая True или False .
Пример использования:
from fnmatch import *
s = ['Привет','пакет','приток','перемена']
for x in s:
if fnmatch(x,'п*е?'): print(x,'yes')
else: print(x,'no')
Результат запуска:
Привет yes
пакет yes
приток no
перемена no
Строки Привет и пакет соответствуют шаблону (маске) п*е?
* - это любая группа символов (в том числе пустая)
? - ровно один любой символ (пустоты быть не может)
Применение функции fnmatch в задачах
Задача 1. В каталоге находится 6 файлов:
adobe.xls
idol.xlsx
london.xls
adobe.xml
odor.xlsx
sdoba.xls
Определите, по какой из масок из них будет отобрана указанная группа файлов:
adobe.xls
idol.xlsx
odor.xlsx
sdoba.xls
1) ?do*.xls
2) ?do?*.xls*
3) *do*.x*
4) ?do?.xls*
Программа решения на языке Phyton
from fnmatch import *
dir_ = ['adobe.xls','idol.xlsx','london.xls','adobe.xml','odor.xlsx','sdoba.xls']
group = ['adobe.xls','idol.xlsx','odor.xlsx','sdoba.xls']
pattern = ['?do*.xls','?do?*.xls*','*do*.x*','?do?.xls*']
for pat in pattern:
list_ = []
for filename in dir_:
if fnmatch(filename,pat):
list_.append(filename)
if list_ == group:
print('маска',pat,'номер:',pattern.index(pat)+1)
Результат запуска
маска ?do?*.xls* номер: 2
Ответ: 2
Задача 2. (PRO100 ЕГЭ) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
Как будем решать задачу
Заведем счетчик подходящих чисел p. Запустим цикл от 0 до 17*10**6 с шагом 161. Проверим, соответствует ли число маске, если да, то [проверим, кратен ли счетчик числу 500, если кратен выедем число и частное числа на 161], увеличим счетчик чисел p.
Программа решения на языке Phyton
from fnmatch import *
pattern='*1?*?68*'
p=0
for n in range(0,17*10**6+1,161):
if fnmatch(str(n),pattern):
if p%500==0:
print(n,n//161)
p+=1
Результат запуска (ответ)
14168 88
10658683 66203
12668285 78685
14702681 91321
16738687 103967
Комментарии