Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Современные средства разработки программного обеспечения. Учебное пособие
.pdf
131
Регулярное выражение – это способ распознавания и часто извлечения данных
из определенных шаблонов текста.
Считается, что регулярное выражение, которое распознает фрагмент текста или
строку, соответствует этому тексту или строке.
Регулярное выражение определяется строкой, определенной из символов (так
называемых метасимволов), имеющих особое значение, что позволяет одному РВ со-
ответствовать многим различным конкретным строкам.
Функциональность регулярных выражений в Python находится в модуле с именем re. Модуль re содержит множество полезных функций и методов.
Наиболее часто используется функция re.search(), которая проверяет строку на
соответствие регулярному выражению.
re.search(<regex>, <string>) выполняет сканирование <string> в поисках первого
местоположения, где шаблон <regex> совпадает.
Если совпадение найдено, то re.search() возвращает объект соответствия. В про-
тивном случае он возвращает None.
re.search() принимает необязательный третий аргумент <flags>.
В RE используют либо литералы, либо метасимволы. Литералы – это сами символы и не имеют особого значения.
В простейшем случае шаблон <regex> представляет собой простую python
строку из литералов. Сопоставление с шаблоном в этом случае является просто посимвольным сравнением, практически таким же, как для python строк оператор in и
метод .find().
Пример. Программа, использующая регулярное выражение, которое подсчитывает, сколько строк в текстовом файле содержит слово python. Строка, содержащая
слово python более одного раза, будет засчитана только один раз.
import re
regexp = re.compile("python")
count = 0
file = open("textfile", 'r')
for line in file.readlines():
if regexp.search(line):

132
count = count + 1
file.close()
print(count)
В примере скомпилировано регулярное выражение, из слова "python", которое
можно использовать для поиска других экземпляров слова "python" в других строках,
как поиск подстроки в строке.
Поиск осуществляется с помощью метода search, который возвращает None,
если регулярное выражение не найдено в строковом аргументе. Python интерпретирует None как false в логическом контексте.
В примере не учитываются заглавные буквы.
Пример. Варианты регулярных выражений для поиска с учетом заглавных букв.
regexp = re.compile("python|Python ")
regexp = re.compile("(p|P)ython ")
regexp = re.compile("[pP]ython ")
Реальная мощь сопоставления регулярных выражений в Python проявляется,
когда <regex> содержит специальные символы, называемые метасимволами. Метасимволы имеют уникальное значение для механизма сопоставления регулярных
выражений и значительно расширяют возможности поиска.
В регулярном выражении набор символов, указанный в квадратных скобках
([]), составляет символьный класс.
Классы символов или наборы символов
Классы символов - это метасимволы, которые задают соответствие одному
символу из указанного набора символов.
Классы символов заключены в квадратные скобки []. Вот несколько примеров
классов символов:
− [abc] − Соответствует либо a, b, либо c.
− [0-9] − Соответствует любой цифре от 0 до 9.
− [a-z] − Соответствует любой строчной букве от a до z.
Чтобы сопоставить a или e, используют [ae]. Можно использовать это
в gr[ae]y для соответствия либо gray , либо grey. Класс символов соответствует

133
только одному символу. gr[ae]y не соответствует graay, graey или чему-либо
подобному. Порядок символов внутри символьного класса не имеет значения.
Можно использовать дефис внутри символьного класса для указания диапазона
символов. [0-9] соответствует единственной цифре от 0 до 9.
Можно использовать более одного диапазона. [0-9a-fA-F] соответствует
единственной шестнадцатеричной цифре без учета регистра. Можно комбинировать
диапазоны и отдельные символы. [0-9a-fxA-FX] соответствует шестнадцатеричной
цифре или букве X.
Ввод символа каретки после открывающей квадратной скобки аннулирует
класс character. В результате класс character соответствует любому символу,
которого нет в классе character. q[^x] соответствует qu в вопросе. Оно
не соответствует Fraq, поскольку после q нет символа, которому соответствовал бы
класс отрицаемых символов.
Выводы
В разделе рассмотрены базовые сведения по работе со строками и наиболее
важные возможности Python в области регулярных выражений. Пропущены многие
специальные символы регулярных выражений, но можно найти полный список в
документации по Python. В дополнение к теме о регулярных выражениях в
cправочном руководстве по библиотеке Python, можно найти отличный учебник [40].
9.4 Контрольные вопросы
1 Что представляет собой строка в Python?
2 Как использовать срезы для строк в Python&
3 Как включить в строку специальные символы, такие как кавычки или обрат-
ная косая черта?
4 Перечислите основные встроенные методы в Python для управления стро-
ками и их преобразования.
5 Какой метод в Python осуществляет кодирование строк в байты?
6 Что такое регулярные выражения?

134
7 В виде чего определяются в Python регулярные выражения?
8 Как работает в Python функция re.search()?
9 Какие выделяют в Python классы символов для регулярных выражений?

135
10 Работа с файлами в Python
10.1 Работа с текстовыми и бинарными файлами в Python
Обработка файлов на Python отличается высокой гибкостью, поскольку позволяет работать с различными типами файлов (например, текстовыми файлами, двоичными файлами, CSV-файлами и т.д.) и выполнять различные операции с файлами
(например, чтение, запись, добавление и т.д.).
Python по-разному обрабатывает разные типы файлов, такие как текстовые или
двоичные файлы (записанные на двоичном языке, 0 и 1).
Текстовые файлы. В файлах этого типа каждая строка текста включает последовательность символов и заканчивается специальным символом, называемым EOL
(Конец строки), который по умолчанию является символом новой строки (‘\n’) или
символами конца строки, такими как запятая {,} или символом перевода строки.
Двоичные файлы. В файлах этого типа нет ограничителя для строки, и данные
сохраняются после преобразования их в понятный машине двоичный язык.
Работа с файлом состоит из этапов:
1) открытие файла;
2) работа с файлом;
3) закрытие файла.
Функция открытия файла:
open(file [, mode=’r’, encoding=None, …]),
где
- file – это путь к файлу вместе с его именем;
- mode – режим доступа к файлу;
- encoding – кодировка файла.
Режимы доступа определяют тип операций, допустимых для обработки данных
в открытом файле. Эти режимы также определяют расположение дескриптора файла
в файле. Дескриптор файла подобен курсору, который определяет, откуда данные
должны быть прочитаны или записаны в файл.
В Python существуют режимы доступа такие как:

136
Только для чтения (‘r’): открыть текстовый файл для чтения. Маркер располо-
жен в начале файла. Если файл не существует, возникает ошибка ввода-вывода. Это
также режим по умолчанию, в котором открывается файл.
Чтение и запись (‘r+’): открыть файл для чтения и записи. Маркер расположен
в начале файла. Выдает ошибку ввода-вывода, если файл не существует.
Только для записи (‘w’) : открыть файл для записи. Для существующих файлов
данные усекаются и перезаписываются. Дескриптор располагается в начале
файла. Создает файл, если файл не существует.
Запись и чтение (‘w+’) : открыть файл для чтения и записи. Для существую-
щего файла данные усекаются и перезаписываются. Дескриптор располагается в
начале файла.
Только добавлять (‘a’): открыть файл для записи. Файл создается, если он не
существует. Дескриптор расположен в конце файла. Записываемые данные будут
вставлены в конце, после существующих данных.
Добавить и прочитать (‘a+’): Открыть файл для чтения и записи. Файл созда-
ется, если он не существует. Дескриптор расположен в конце файла. Записываемые
данные будут вставлены в конце, после существующих данных.
Пример. Открытие и закрытие файла:
Fin = open ( "input.txt" )
Fout = open ( "output.txt", "w" )
# работа с файлами
Fout.close()
Fin.close()
Кодировка в файле должна совпадать с кодировкой функции чтения файла, в
функции read по умолчанию используется кодировка Windows-1251. Можно
также явно указывать кодировку, Для этого следует воспользоваться именован-
ным параметром encoding в методе open:
file = open("myfile.txt", encoding="utf-8" )
Чтение из файла на Python.
Существует более одного метода чтения данных из файла на Python.

137
read ([size]): считывает весь файл и возвращает его содержимое в виде
строки. Считывает из файла не более size байт (меньше, если чтение достигает EOF
до получения size байт). Если аргумент size отрицательный или опущен, считывают
все данные, пока не будет достигнут EOF.
Пример.
# Reading a file
f = open(__file__, 'r')
#read()
text = f.read(10)
print(text)
f.close()
readline([size]): считывает первую строку файла, т. е. до символа перевода
строки или EOF, в случае, если файл состоит из одной строки, и возвращает строку.
Если аргумент size присутствует и неотрицателен, это максимальное количество байтов (включая завершающий символ новой строки), и может быть возвращена неполная строка. Пустая строка возвращается только тогда, когда сразу встречается EOF.
Пример.
Reading a line in a file
f = open(__file__, 'r')
#readline()
text = f.readline(20)
print(text)
f.close()
readlines([sizehint]): читает весь файл построчно и обновляет каждую строку до
возвращаемого списка. Считывает до EOF с помощью readline() и возвращает список,
содержащий прочитанные таким образом строки. Если присутствует необязательный
аргумент sizehint, то вместо чтения до EOF считываются целые строки общим объемом примерно в sizehint байт (возможно, после округления до размера внутреннего
буфера).

138
Пример.
1 Считать файл до конца методом readlines() с указанием объема чтения
# Reading a file
f = open(__file__, 'r')
#readline()
text = f.readlines(25)
print(text)
f.close()
2 Считать файл до конца методом readlines()
Fin = open ( "input.txt" )
lst = Fin.readlines()
for str in lst:
print ( str, end = "" )
Fin.close()
3 Считать файл до конца в стиле Python:
for str in open ( "input.txt" ):
print ( str, end = "" )
Запись в файл на Python.
В Python есть несколько методов записи данных в файл.
1 write(string): записывает содержимое string в файл. Оно не имеет возвраща-
емого значения. Из-за буферизации строка может фактически не отображаться в
файле, пока не будет вызван метод flush() или close().
Пример.
1 Записать строку в файл методом write
# Writing a file
fileName="D:/out.txt"
f = open(__file__, 'w')
line = 'Hello\n'
#write()
f.write(line)
f.close()

139
2 Записать данные в файл, используя определенный шаблон вывода.
Fout.write ( "{:d} + {:d} = {:d}\n".format(x, y, x+y) )
В таком случае вместо шаблонов {:d} последовательно подставляются значения параметров метода format (сначала x, затем y, затем x+y).
3 Записать данные в файл, используя режим 'a'
# Appending a file
f = open(__file__, 'a')
lines = 'Welcome Geeks\n'
f.write(lines)
f.close()
4 Записать данные в файл, используя режим 'a+'
# Appending and reading a file
f = open(__file__, 'a+')
lines = f.read()
f.write(lines)
f.close()
2 writelines(sequence): записывает последовательность строк в файл, обычно
это список строк или любой другой повторяющийся тип данных. У него нет возвращаемого значения.
Пример.
# Writing a file
f = open(__file__, 'a+')
lines = f.readlines()
#writelines()
f.writelines(lines)
f.close()
3 tell(): возвращает целое число, которое сообщает нам позицию файлового
объекта от начала файла в виде байтов
Пример.

140
# Telling the file object position
f = open(__file__, 'r')
lines = f.read(10)
#tell()
print(f.tell())
f.close()
4 seek(offset, from_where) используется для изменения положения файлового
объекта. Смещение указывает количество байтов, которые необходимо переместить.
Параметр from_where указывает, откуда должны быть перемещены байты.
Пример.
# Setting the file object position
f = open(__file__, 'r')
lines = f.read(10)
print(lines)
#seek()
print(f.seek(2,2))
lines = f.read(10)
print(lines)
f.close()
5 flush(): очищает внутренний буфер. Не имеет возвращаемого значе-
ния. close() автоматически удаляет данные, но при желании удалить данные перед закрытием файла, можно использовать этот метод.
Пример.
# Clearing the internal buffer before closing the file
f = open(__file__, 'r')
lines = f.read(10)
#flush()
f.flush()
print(f.read())
f.close()
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
