Вы находитесь на странице: 1из 22

Урок 10

РЕГУЛЯРНЫЕ
ВЫРАЖЕНИЯ.
ПРИЛОЖЕНИЕ
«КИБЕРЗАЩИТНИК»

Содержание
Регулярные выражения...............................................3
Создание приложения
«Киберзащитник»......................................................... 11

Материалы к уроку прикреплены к данному PDF-файлу.


Д ля доступа к материалам необходимо открыть урок
в программе Foxit PDF Reader.

2
Регулярные выражения. Приложение «Киберзащитник»

Регулярные выражения
Каждый, кто хоть однажды проходил регистра-
цию, сталкивался с требованиями ко вводу логина
или пароля (рис. 1).
Логином чаще всего будет e-mail, а во время уста-
новки пароля ставятся требования к его длине и сим-
волам, которые должны быть использованы. Все эти
средства помогают сервисам работать корректно и за-
щищать данные пользователей.

Рисунок 1

3
Урок 10

Но как именно программа определяет соответствие


введенного заданным требованиям?
На помощь приходят регулярные выражения,
представляющие собой строку из спецсимволов. Ими
задается паттерн поиска, на который затем и проверя-
ется введенная строка.
Для работы с ними в Python предусмотрен модуль
re. Поэтому импортируем его, потому что нашей помо-
щи уже заждались.

import re

Дело в том, что нас попросили найти миньона Боба,


который затерялся среди собратьев:

minyons_1 = "Minyon minYon Mineyon mIniYon monyon


minyoN mInYoN miNYon maNYoN MINYON mOnYoN ManyoN"
minyons_2 = "minyon miNYon mIneYon MinYoN MaNyon
MonYon Minyon Bob ManYon minYON MiNyon MinyoN
MonyoN"

Но прежде чем начать поиски, необходимо создать


само регулярное выражение, для чего воспользуемся
методом compile():

Bob = re.compile("Bob")

Теперь, когда объект создан, можно начать поиски.


Поскольку никаких спецсимволов не было использо-
4
Регулярные выражения. Приложение «Киберзащитник»

вано, будет искаться в точности строка "Bob". А ме-


тод, который нам понадобится, называется search()
(видео 1):
import re

minyons_1 = "Minyon minYon Mineyon mIniYon monyon


minyoN mInYoN miNYon maNYoN MINYON mOnYoN ManyoN"
minyons_2 = "minyon miNYon mIneYon MinYoN MaNyon
MonYon Minyon Bob ManYon minYON MiNyon MinyoN
MonyoN"

Bob = re.compile("Bob")
match_1 = Bob.search(minyons_1)
print(match_1)
match_2 = Bob.search(minyons_2)
print(match_2)

Видео 1

5
Урок 10

Как видно, в первой строке Боб не был найден, во


второй – наоборот. А в результате вернулась сама стро-
ка и ее индексы. Но помните, этот метод находит толь-
ко первое совпадение. А чтобы найти все совпадения,
можно воспользоваться методом finditer(). Добавим
еще нескольких Бобов в строки, чтобы работа метода
стала более наглядной (видео 2):

Видео 2

import re

minyons_1 = "Bob Minyon minYon Mineyon mIniYon


monyon minyoN mInYoN miNYon maNYoN MINYON mOnYoN
ManyoN"

6
Регулярные выражения. Приложение «Киберзащитник»

minyons_2 = "minyon miNYon mIneYon MinYoN


MaNyon MonYon Minyon Bob ManYon minYON MiNyon
MinyoN Bob MonyoN"

Bob = re.compile("Bob")

match_1 = Bob.finditer(minyons_1)
for _ in match_1:
print(f"match_1 – {_}")
match_2 = Bob.finditer(minyons_2)
for _ in match_2:
print(f"match_2 – {_}")

Но позицию искомого паттерна не всегда нужно


знать. Тогда пригодится метод findall() (видео 3):

import re

minyons_1 = "Bob Minyon minYon Mineyon mIniYon


monyon minyoN mInYoN miNYon maNYoN MINYON mOnYoN
ManyoN"
minyons_2 = "minyon miNYon mIneYon MinYoN
MaNyon MonYon Minyon Bob ManYon minYON MiNyon
MinyoN Bob MonyoN"

Bob = re.compile("Bob")

match_1 = Bob.findall(minyons_1)

7
Урок 10

match_2 = Bob.findall(minyons_2)

print(match_1)
print(match_2)

Видео 3

Еще одним важным методом является sub(), кото-


рый позволяет не только найти подходящий паттерн, но
и заменить его другим (видео 4):

import re

minyons = "minyon miNYon mIneYon MinYoN MaNyon


MonYon Minyon Bob ManYon minYON MiNyon MinyoN
Bob MonyoN"

Bob = re.compile("Bob")

8
Регулярные выражения. Приложение «Киберзащитник»

minyons_with_Kevin_1 = Bob.sub("Kevin", minyons)


print(minyons_with_Kevin_1)

Видео 4

Осталось рассмотреть два метода:


■■ split() – аналогичен методу split() строки (видео 5):

import re

minyons = "minyon miNYon mIneYon MinYoN MaNyon


MonYon Minyon Bob ManYon minYON MiNyon MinyoN
Bob MonyoN"

Bob = re.compile("Bob")

splitty = Bob.split(minyons)
print(splitty)

9
Урок 10

Видео 5

■■ fullmatch() – возвращает объект Match в случае


полного совпадения со строкой. В ином случае воз-
вращается None (видео 6):

Видео 6

10
Регулярные выражения. Приложение «Киберзащитник»

import re

minyons = "Bob"
minyons_2 = "Bob Kevin"

Bob = re.compile("Bob")
fullmatch_1 = Bob.fullmatch(minyons)
fullmatch_2 = Bob.fullmatch(minyons_2)
print(fullmatch_1)
print(fullmatch_2)

Создание приложения
«Киберзащитник»
Время использовать приобретенные знания и раз-
работать приложение по аутентификации.
Импортируем модули tkinter и re:

import tkinter as tk
import re

Следующим шагом создадим паттерн логина.


Поскольку им будет e-mail, то и задать должны соот-
ветствующий паттерн. Помогут в его создании так на-
зываемые «сырые» строки. Их отличие от обычных
заключается в том, что Python будет воспринимать
имеющиеся служебные символы как составную часть

11
Урок 10

строки. Чтобы создать такую строку, нужно перед ка-


вычками поставить символ r:

login_pattern = re.compile(r"")

Теперь наполним выражение содержанием. Доступ-


ными символами для его начала являются буквы, цифры
и нижнее подчеркивание, а длину этой части установим
от трех до двадцати знаков. Поэтому первым установим
символ «каретки» ^, что означает начало строки. Доба-
вим \w, смысл которого и указывает на то, что вместо
него может быть любой буквенно-цифровой символ
и нижнее подчеркивание. Добавим фигурные скобки,
внутри которых укажем минимальное и максимальное
количество символов:

login_pattern = re.compile(r"^\w{3,20}")

Далее должна быть собачка @, поэтому просто до-


бавляем ее:

login_pattern = re.compile(r"^\w{3,20}@")

После него должны располагаться от двух до десяти


буквенных символов. Чтобы задать это, откроем квад-
ратные скобки, внутрь которых пропишем диапазон
буквенных символов латинского алфавита. Поскольку
все буквы возможны для вставки, то диапазон будет вы-
глядеть как a-z. Аналогично предыдущей части устано-
вим их количество:

12
Регулярные выражения. Приложение «Киберзащитник»

login_pattern = re.compile(r"^\w{3,20}@[a-z]{2,10}")

Следующим символом является точка, а заканчи-


вать выражение должны буквенные символы в количе-
стве от двух до шести.

Обратите внимание, несмотря на «сырые» строки,


точка все равно считается служебным символом,
поэтому перед ней нужно добавить знак \.

Символом окончания строки является $:

login_pattern = re.compile(r"^\w{3,20}@[a-z]
{2,10}\.[a-z]{2,6}$")

Самую сложную ступень завершили, создадим ре-


гулярное выражение для пароля. Допустимыми симво-
лами для него являются буквенно-цифровые и нижнее
подчеркивание. Минимальную и максимальную длину
ограничим на уровне восьми и шестнадцати знаков со-
ответственно:

password_pattern = re.compile(r"^\w{8,16}$")

Больше информации о регулярных выражениях


можно найти, перейдя по ссылке:
https://docs.python.org/3/library/re.html.
А редактировать их поможет сервис по такой ссылке:
https://regex101.com/.

13
Урок 10

Паттерны готовы, перейдем к построению про-


граммы.
Создадим окно и настроим его:
root = tk.Tk()
root.geometry("400x250+700+500")
root.iconbitmap("padlock.ico")
root.resizable(False, False)

Объявим функцию, которая будет вызываться при


нажатии на клавишу LOGIN.
def logining():
pass

Создадим информационные этикетки, которые бу-


дут указывать, куда вводить логин, а куда – пароль.
login_label = tk.Label(root, text="Login",
font=("Arial", 14), padx=50)
password_label = tk.Label(root, text="Password",
font=("Arial", 14), padx=50)

Но как сделать поля ввода? Пригодятся объекты


Entry. Создадим их, указав привычные параметры:
login_entry = tk.Entry(root, font=("Arial", 12),
width=20)
password_entry = tk.Entry(root, font=("Arial", 12),
width=20)

14
Регулярные выражения. Приложение «Киберзащитник»

Но возникает проблема, ведь пароль должен быть


закрытым от показа. Не беда! Установим атрибут show
со значением *.
password_entry = tk.Entry(root, font=("Arial", 12),
width=20, show="*")

Зададим клавишу логирования:


login_button = tk.Button(root, text="LOGIN",
font=("Arial", 16), width=12, command=
logining)

Настроим колонки и строки, чем подготовимся к


размещению элементов с помощью метода grid():

root.grid_columnconfigure(0, minsize=150)
root.grid_columnconfigure(1, minsize=250)
root.grid_rowconfigure(0, minsize=90)
root.grid_rowconfigure(1, minsize=90)
login_button.grid(columnspan=2)

Теперь разместим элементы в окне. Обратите внима-


ние на атрибут sticky. Он работает аналогично атри-
буту anchor и выравнивает элементы в соответствии с
заданной стороной мира. Последней строкой вызовем
метод mainloop():

login_label.grid(column=0, row=0, sticky="w")


password_label.grid(column=0, row=1, sticky="w")

15
Урок 10

login_entry.grid(column=1, row=0, sticky="w")


password_entry.grid(column=1, row=1, sticky="w")
login_button.grid(column=0, row=2)

root.mainloop()

Теперь время поработать над функцией логирова-


ния. Первым шагом определим введенную к объектам
Entry информацию, для чего воспользуемся методом
get():
def logining():
login = login_entry.get()
password = password_entry.get()

Теперь проверим, найдутся ли соответствующие


паттерны во введенных данных. При благоприятном
исходе подсветим поле зеленым цветом, воспользовав-
шись методом config(), который изменит атрибут bg.
В ином случае цвета полей ввода станут красного цвета:

def logining():
login = login_entry.get()
password = password_entry.get()
if login_pattern.search(login):
if password_pattern.search(password):
login_entry.config(bg="green")
password_entry.config(bg="green")
else:

16
Регулярные выражения. Приложение «Киберзащитник»

login_entry.config(bg="red")
password_entry.config(bg="red")
else:
login_entry.config(bg="red")
password_entry.config(bg="red")

Готовый код программы будет выглядеть так:

import tkinter as tk
import re

login_pattern = re.compile(r"^\w{3,20}@[a-z]
{2,10}\.[a-z]{2,6}$")
password_pattern = re.compile(r"^\w{8,16}$")

root = tk.Tk()
root.geometry("400x250+700+500")
root.iconbitmap("padlock.ico")
root.resizable(False, False)

def logining():
login = login_entry.get()
password = password_entry.get()
if login_pattern.search(login):
if password_pattern.search(password):
login_entry.config(bg="green")
password_entry.config(bg="green")
else:

17
Урок 10

login_entry.config(bg="red")
password_entry.config(bg="red")
else:
login_entry.config(bg="red")
password_entry.config(bg="red")

login_label = tk.Label(root, text="Login",


font=("Arial", 14), padx=50)
password_label = tk.Label(root, text="Password",
font=("Arial", 14), padx=50)

login_entry = tk.Entry(root, font=("Arial", 12),


width=20)
password_entry = tk.Entry(root, font=("Arial", 12),
width=20, show="*")

login_button = tk.Button(root, text="LOGIN",


font=("Arial", 16), width=12, command=
logining)

root.grid_columnconfigure(0, minsize=150)
root.grid_columnconfigure(1, minsize=250)
root.grid_rowconfigure(0, minsize=90)
root.grid_rowconfigure(1, minsize=90)

login_button.grid(columnspan=2)

login_label.grid(column=0, row=0, sticky="w")


password_label.grid(column=0, row=1, sticky="w")

18
Регулярные выражения. Приложение «Киберзащитник»

login_entry.grid(column=1, row=0, sticky="w")


password_entry.grid(column=1, row=1, sticky="w")
login_button.grid(column=0, row=2)

root.mainloop()

Запустим код (видео 7):

Видео 7

19
Урок 10

Сегодня мы рассмотрели одну из самых сложных, но


важных тем программирования. Научились созда-
вать паттерны и проверять с их помощью введенные
данные, а привлечение графического интерфейса
позволило разработать полезное приложение.

20
Регулярные выражения. Приложение «Киберзащитник»

21
Урок 10
РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ.
ПРИЛОЖЕНИЕ
«КИБЕРЗАЩИТНИК»

© Компьютерная Академия ШАГ


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объеме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии с законодательством о свободном использовании произведения
без согласия его автора (или другого лица, имеющего авторское право на данное
произведение). Объем и способ цитируемых произведений соответствует принятым
нормам, не наносит ущерба нормальному использованию объектов авторского
права и не ущемляет законные интересы автора и правообладателей. Цитируемые
фрагменты произведений на момент использования не могут быть заменены
альтернативными, не охраняемыми авторским правом аналогами, и как таковые со-
ответствуют критериям добросовестного использования и честного использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое использо-
вание материалов определяется действующим законодательством.

Вам также может понравиться