11.Библиотека fnmatch

В одном из заданий ЕГЭ необходимо сверять некоторые значения с так называемыми масками (регулярными выражениями). Примеры регулярных выражений (масок):

  • "123*094" - данной маске подойдут строки с символами "123" в начале, с любым количеством любых символов в середине ("sglfd;fdfg;34r" например) или отсутствие символов, после с символами "094" в конце;
  • "123?094" - данной маске подойдут строки с символами "123" в начале, с любым символом
    ("f" например), после с символами "094" в конце.
Примечание: в первом примерах подойдёт строка "123094", а во втором - не подойдёт.

Для проверки строк на соответствие маске мы воспользуемся функцией fnmatch из одноимённой библиотеки: from fnmatch import fnmatch
mask = "325?12*124"

example1 = "32512124"
example1 = "3251012123021124"
example1 = "325912124"
example1 = "325712894dsd124"

print(fnmatch(example1, mask)) # False
print(fnmatch(example2, mask)) # False
print(fnmatch(example3, mask)) # True
print(fnmatch(example4, mask)) # True

Разберём одно задание из ЕГЭ:
Маска числа  — это последовательность цифр, в которой могут встречаться специальные символы «?» и «*». Символ «?» означает ровно одну произвольную цифру, символ «*» означает произвольную (в том числе пустую) последовательность цифр.

Пример. Маске 123*4?5 соответствуют числа 123405 и 12376415.

Найдите все натуральные числа, не превышающие 10^10, которые соответствуют маске 1?954*21 и при этом без остатка делятся на 3023.

В ответе запишите все найденные числа в порядке возрастания.
Решение: from fnmatch import fnmatch
for x in range(0, 10 ** 10, 2023):
if fnmatch(str(x), '1?954*21'):
print(x)
Вывод:
1895421
1295437121
1395498421
1795441321

Это простой задание, не все подобные задания решаются так просто.

Тесты для данного блока не предусмотрены.

Задания в практике представлены для демонстрации, лучше решать задания из других источников!