ЛАБОРАТОРНАЯ РАБОТА №9

Тема: Регулярные выражения

Цель: Изучение средств языка Python для работы с регулярными выражениями

ОГЛАВЛЕНИЕ

Введение
1 Синтаксис регулярных выражений
1.1 Представление символов
1.2 Позиция внутри строки
1.3 Квалификаторы повторения
2 Функции, методы и константы регулярных выражений
2.1 Модуль re
2.1.1 Константы модуля re
2.1.2 Функции модуля re
2.2 Методы объектов класса RegexpObject
2.3 Методы объектов класса MatchObject
2.4 Использование скобок в регулярных выражениях
3 Использование регулярных выражений
Пример №1
Индивидуальные задания

 Оглавление

Введение

Регулярные выражения (англ. regular expressions, сокр. RegExp) – это формальный язык поиска подстрок в тексте и осуществления манипуляций с ними, основанный на использовании метасимволов (англ. wildcard characters). По сути это шаблон (англ. pattern), строка-образец, состоящая из символов и метасимволов и задающая правило поиска.
Регулярные выражения (РВ) изобрел американский математик, один из основателей направления "Компьютерные науки" Стефан Клини (Stephen Kleene), который описал поведение модели нейрона, предложенной в 1940-х гг. Уорреном Маккалоком и Уолтером Питтсом, используя свою систему математических обозначений, названную им "регулярные множества".
Регулярные выражения произвели прорыв в электронной обработке текстов в конце XX века. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них Perl, Java, PHP, Python, JavaScript и многие др.
Вместе с тем, необходимо заметить, что не все возможные задачи обработки текста могут быть решены с помощью РВ, поскольку язык регулярных выражений относительно прост и ограничен. Кроме того, в отдельных случаях, когда РВ имеют сложную форму, бывает проще решить задачу, применив код на языке Python, который может работать быстрее и иметь более простой вид.

 Оглавление

1 Синтаксис регулярных выражений

1.1 Представление символов

Большинство символов в регулярном выражении являются простыми символами, т.е. такими, которые представляют сами себя, за исключением символов [ ] \ ^ $ . | ? * + ( ) { }, которые являются метасимволами. К метасимволам также относятся некоторые простые символы с предшествующим символом \ (обратный слеш). Метасимволы в РВ имеют следующиее назначение:

 Оглавление

1.2 Позиция внутри строки

Следующие метасимволы позволяют спозиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова:

 Оглавление

1.3 Квалификаторы повторения

Квалификатор (англ. qualifier) повторения после символа, символьного класса или группы (см. подраздел 2.4 ) определяет, сколько раз предшествующее выражение может встречаться в строке:

Если символы { } не образуют квалификатор, их специальное значение игнорируется.

 Оглавление

2 Функции, методы и константы регулярных выражений

2.1 Модуль re

Для работы с регулярными выражениями на языке Python необходимо подключить модуль re, который содержит описания функций, констант и исключения.
Регулярные выражения на языке Python могут быть заданы в двух формах:

Компиляция осуществляется с помощью функции compile(pattern[,flags]) модуля re, которая компилирует шаблон РВ pattern, заданный в виде строки, и возвращает результат в виде объекта регулярного выражеиния (экземпляра класса RegexpObject). Необязательный параметр flags позволяет модифицировать поведение регулярного выражения (см. подраздел 2.1.1 ).
Использование объектов РВ, которые имеют свои методы поиска (см. подраздел 2.2 ), вместо шаблонов РВ позволяет ускорить работу с регулярными выражениями. Кроме того, последние используемые объекты РВ кэшируются и не требуют повторной компиляции. Методы объектов РВ имеют дополнительные возможности по сравнению с функциями модуля re. Поэтому большинство нетривиальных решений использует именно объекты регулярных выражений.

 Оглавление

2.1.1 Константы модуля re

Модуль re содержит константы, которые задают значения следующих флагов регулярных выражений, используемых в функциях модуля re (см. подраздел 2.1.2 ) (в скобках показана сокращенная форма флага):

 Оглавление

2.1.2 Функции модуля re

Помимо функции compile() (см. подраздел 2.1 ) модуль re содержит следующие функции:

 Оглавление

2.2 Методы объектов класса RegexpObject

Объекты регулярных выражений (экземпляры класса RegexpObject) возвращает функция compile() модуля re в результате компиляции регулярных выражений, заданных в виде шаблона-строки (см. подраздел 2.1 ):

>>> import re
>>> p=re.compile( 'ab*' ).

Объекты класса RegexpObject имеют следующие методы:

 Оглавление

2.3 Методы объектов класса MatchObject

Функции search() и match() модуля re, а также методы search() и match() объектов класса RegexpObject при успешном поиске возвращают значения в виде объектов класса MatchObject:

>>> r=p.match( 'abba' )
>>> r
<_sre.SRE_Match object; span=(0, 3), match='abb'>.

В противном случае возвращаеют значение None:

>>> print (p.match( 'cat' )
None .

Объекты класса MatchObject имеют следующие методы:

Метод span() можно также использовать для просмотра позиций найленных подстрок итератора, полученного методом p.finditer():

>>> ite=p.finditer( '"abba\'s" music - abcolute ' )
>>> ite
<callable_iterator object at 0x02308EB0>
>>> for m in ite: print (m.span())
(1, 4)
(4, 5)
(17, 19)

 Оглавление

2.4 Использование скобок в регулярных выражениях

Для обозначения группы символов регулярного выражения используются круглые скобки, которые, являясь метасимволами, определяют операции, их область действия и приоритет над указанными в группе символами.
В настоящее время скобкам регулярных выражений уделяется особое внимание. Например, разработчики последних версий языка PERL дальнейшее развитие РВ видят не в создании новых метасимволов или разработке новых методов, а в использовании скобок для задания специальных выражений, расширяющих функциональные возможности регулярных выражений. По этому пути пошли и разработчики яыка Python – для указания особенностей регурярных выражений языка Python в скобках помещается буква "P" (см. ниже).
Шаблон внутри группы обрабатывается как единое целое, может быть квалифицирован и выполняет сделующие функции:

Одно из применений группирования – повторное использование ранее найденных групп символов (подстрок, блоков, отмеченных подвыражений). При обработке выражения подстроки, найденные по шаблону внутри группы, сохраняются в памяти и получают номер начиная с единицы. Каждой подстроке соответствует пара скобок в регулярном выражении. Python поддерживается до 99 нумерованных подстрок с номерами от 1 до 99. В регулярном выражении можно ссылаться на раннее найденные группы по их номерам, используя обратный слэш – \1 - \99. Например, найдем в строке повторяющиеся слова:

>>> p=re.compile( r'(\b\w+)\s+\1' )
>>> p.search( 'The cat and the the dog' ).group()
'the the'.

Оглавление

3 Использование регулярных выражений

Использование регулярных выражений для проверки данных пользователя показано в клиент-серверном приложении, клиентская часть которого реализована в виде примера №1, содержащего HTML-форму, которая имеет текстовое поле для ввода фамилии и инициалов пользователя ("user_name") и две кнопки: "Сброс" и "Передать данные":

 Оглавление

Пример №1

<!DOCTYPE html>
<html>
<head>
<title>Передача данных серверу для проверки</title>
<link rel="stylesheet" href="file:///D:/!PYTHON/lab.css">
</head>
<body>
<h1>Передача данных серверу для проверки</h1>
<form method="get" action="http://zykov/PYTHON/get_data_form.py">
Введите фамилию и инициалы:
<input type="text" class="form" name="user_name"><br><br>
<input type="reset" value="Сброс" class="kn">&nbsp;&nbsp;
<input type="submit" value="Передать данные" class="kn">
</form>
</body>
</html>

После ввода пользователем своей фамилии и инициалов и нажатия кнопки "Передать данные" браузер отправляет введенные данные серверному приложению get_data_form.py:

#!c: . . . /Python35-32/python.exe
print ( "Content-Type: text/html\n" )
import cgi, cgitb, my_cgi, re
cgitb.enable()
user_name=cgi.parse()[ "user_name" ][0]
print (my_cgi.H, "Проверка данных пользоваетеля с помощью регулярных выражений" )
p=re.compile( r'^([А-Я][а-я]+)\s[А-Я]\.[А-Я]\.$' )
m=p.match(user_name)
if m:
print (my_cgi.H2, "Тов. " , m.group(1), "!" , sep= "" )
print (my_cgi.D, "Данные введены правильно." )
else : print (my_cgi.D, "Данные введены неправильно." ),

которое выполняет следующие действия:

 Оглавление

Индивидуальные задания

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

В задачи серверной части входит:

Таблица 1 – Перечень заданий

Данные1Данные2Данные3 Литерал
ШаблонМетодШаблонМетодШаблонМетод
1Факультет {}, гр.: {}1Фамилия И. {}2ЗК:{}31
2Ф-т: {} Группа {}4Имя Фамилия {}1Номер ЗК{}22
3факультет - {} груп. {}3Фамилия И.О. {}4ЗК № {}13
4Группа {} ст. {}2И.О. Фамилия {}3Номер тел. {xxxxxx}44
5Гр. {} студент {}1И. Фамилия {}2Тел.:{xx-xx-xx}35
6груп. {} с_т {}4Фамилия И. О.{}1тел.: {xxxxxxx}21
7гр.: {} с-т {}3Имя_Фамилия {}4тел. № {xxx-xx-xx}12
8Студент {}, ф-т: {}2Фамилия И. {}3тел {xxxxxxxxxxx}43
9Ст. {} факультет {}1Имя Фамилия {}2ЗК:{}34
10Студ. {} ф_т {}4Фамилия И.О. {}1Номер ЗК{}25
11С-т {}, ф т: {}3И.О. Фамилия {}4ЗК № {}11
12Факультет {}, гр.: {}2И. Фамилия {}3Номер тел. {xxxxxx}42
13Ф-т: {} Группа {}1Фамилия И. О.{}2Тел.:{xx-xx-xx}33
14факультет - {} груп. {}4Имя_Фамилия {}1тел.: {xxxxxxx}24
15Группа {} ст. {}3Фамилия И. {}4тел. № {xxx-xx-xx}15
16Гр. {} студент {}2Имя Фамилия {}3тел {xxxxxxxxxxx}41
17груп. {} с_т {}1Фамилия И.О. {}2ЗК:{}32
18гр.: {} с-т {}4И.О. Фамилия {}1Номер ЗК{}23
19Студент {}, ф-т: {}3И. Фамилия {}4ЗК № {}14
20Ст. {} факультет {}2Фамилия И. О.{}3Номер тел. {xxxxxx}45

 Оглавление