Skip to content

Latest commit

 

History

History
221 lines (152 loc) · 10.3 KB

File metadata and controls

221 lines (152 loc) · 10.3 KB

Лабораторная работа № 1

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

Теория

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

Чтение из файла

Для чтения из файла необходимо открыть файловый поток, вызвав функцию open():

file = open("file_name.txt", "r")

"file_name.txt" - путь к файлу;

"r" - режим чтения файла (read);

file - переменная файлового потока.

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

  • readline() - считывает одну строку из файла

  • read() - считывает все содержимое файла в одну строку

  • readlines() - считывает все строки файла в список

После чтения файловый поток необходимо закрыть с помощью метода close():

file.close()

Однако, более оптимальным вариантом будет использование конструкции with, которая автоматически закроет файловый поток:

with open("my_file.txt", "r") as file:
    text = file.read()

Аргументы командной строки

Для передачи аргументов черезз командную строку используется встроенный модуль argparse:

import argparse

Пример использования:

import argparse

parser = argparse.ArgumentParser()  # создание экземпляра парсера
parser.add_argument('name', type=str, help='your name')  # добавление позиционного аргумента командной строки
args = parser.parse_args()  # парсинг аргументов
print(f"Hello, {args.name}!")  # использование полученного значения аргумента

'name' - название аргумента (обязательный параметр)

type - тип данных аргумента (необязательный параметр)

help - подсказка для аргумента (необязательный параметр)

Запуск программы:

python my_program.py Ivan
Hello, Ivan!

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

parser.add_argument("-s", "--surname", type=str, help="your surname")

"--surname" - полное название аргумента (обязательный параметр) "-s" - сокращённое название (необязательный параметр)

В командной строке для добавления необязательного аргумента необходимо указать либо полное, либо сокращённое название:

my_program.py Ivan -s Ivanov

или

my_program.py Ivan -surname Ivanov

Также перед использованием необходимо проверять, существует ли такой аргумент:

if args.surname is not None:  # проверка на существование значения
    print(f"Hello, {args.name} {args.surname}!")
else:
    print(f"Hello, {args.name}!")

Регулярные выражения и библиотека re

Регулярные выражения в Python используются для поиска, обработки и манипуляции строками, соответствующими заданным шаблонам. Шаблоном для регулярных выражений может считаться любая строка - в этом случае будет выполнен обычный поиск по подстроке. Если же мы хотим создать более сложный шаблон, то необходимо использовать спецсимволы.

Шаблоны, соответствующие одному символу

  • . - Один любой символ, кроме новой строки \n.
  • \d - Любая цифра
  • \s - Любой пробельный символ (пробел, табуляция, конец строки и т.п.)
  • \w - Любая буква (то, что может быть частью слова), а также цифры и _
  • [..] - Один из символов в скобках, а также любой символ из диапазона a-b
  • [^..] - Любой символ, кроме перечисленных

Квантификаторы (указание количества повторений)

  • {n} - Ровно n повторений
  • {m,n} - От m до n повторений включительно
  • {m,} - Не менее m повторений
  • {,n} - Не более n повторений
  • ? - Ноль или одно вхождение, синоним {0,1}
  • * - Ноль или более, синоним {0,}
  • + - Одно или более, синоним {1,}

Функции библиотеки re

Библиотека re в Python предоставляет функции для работы с регулярными выражениями.

re.search(pattern, string) - Найти в строке string первую строчку, подходящую под шаблон pattern;

re.fullmatch(pattern, string) - Проверить, подходит ли строка string под шаблон pattern;

re.split(pattern, string, maxsplit=0) - Аналог str.split(), только разделение происходит по подстрокам, подходящим под шаблон pattern;

re.findall(pattern, string) - Найти в строке string все непересекающиеся шаблоны pattern;

re.finditer(pattern, string) - Итератор по всем непересекающимся шаблонам pattern в строке string (выдаются match-объекты);

re.sub(pattern, repl, string, count=0) - Заменить в строке string все непересекающиеся шаблоны pattern на repl;

Пример поиска по шаблону:

import re

text = "Список чисел: 123, 456, 789 и 123"  # строка поиска
pattern = r'\d+'  # шаблон
numbers = re.findall(number_pattern, text)
print(numbers)

Результат:

['123', '456', '789', '123']

Пример разделения строки по шаблону:

import re

text = "один, два, три; четыре. пять! шесть"  # строка поиска

# Разделяем строку по разделителям: точка с запятой, запятая, точка, восклицательный знак, пробельный символ
parts = re.split(r'[;,.!\s]+', text)

print(parts)

Результат:

['один', 'два', 'три', 'четыре', 'пять', 'шесть']

Полезные ссылки

Задание

Общее задание

Открыть и прочитать файл. Название файла вводится через аргументы командной строки. Воспользовавшись регулярными выражениями, выполнить задание согласно варианту. Вывести на экран результат.

В файле data.txt дан список анкет людей со следующей структурой:

  • Фамилия
  • Имя
  • Пол
  • Дата рождения
  • Номер телефона
  • Город

Варианты

  1. Посчитайте количество анкет мужчин в списке.
  2. Посчитайте количество людей, родившихся в 21 веке.
  3. Посчитайте количество людей возрастом от 30 до 40 лет.
  4. Найдите всех людей с фамилией Иванов(а). Выведите их анкеты на экран.
  5. Найдите всех людей, чьи телефоны имеют код города 927. Выведите их анкеты на экран.
  6. Найдите всех людей, проживающих в городе Москва. Выведите их анкеты на экран.
  7. Посчитайте, какое имя встречается чаще всего.
  8. Найдите все женские имена, начинающиеся с буквы А.
  9. Пользователь вводит имя человека. Подсчитайте количество людей с таким именем.
  10. Определите, какой код оператора среди телефонных номеров встречается чаще всего.