Функция 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 ЕГЭ) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих 17·106, найдите все числа, соответствующие маске *1?*?68*, делящиеся на 161 без остатка. В ответе запишите в первом столбце таблицы каждое пятисотое найденное число, начиная с первого, в порядке возрастания (1-е, 501-е, 1001-е....), а во втором столбце – соответствующие им результаты деления этих чисел на 161.

Как будем решать задачу

Заведем счетчик подходящих чисел 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



Комментарии