Skip to content

Latest commit

 

History

History
275 lines (205 loc) · 17.7 KB

File metadata and controls

275 lines (205 loc) · 17.7 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 дан список анкет людей со следующей структурой:

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

Валидные форматы для каждого пункта:

  1. Фамилия и имя:
    • Начинаются с заглавной буквы
  2. Пол:
    • М, м, Мужской, мужской, Ж, ж, Женский, женский
  3. Дата рождения:
    • Форматы:
      • 01/01/2000
      • 01-01-2000
      • 01.01.2000
      • 1/1/2000
      • 1-1-2000
      • 1.1.2000
    • Должен быть корректный диапазон дней и месяцев, год - от 1900 до текущего.
  4. Номер телефона или email:
    • Номер телефона:
      • 11 цифр
      • Начинается с 8 или +7
      • Формат:
        • 8 (012) 345-67-89
        • 80123456789
        • 8 012 345-67-89
        • 8 (012) 345 67 89
        • 8 012 345 67 89
    • email:
      • Домены: gmail.com, mail.ru, yandex.ru
      • Локальная часть (название):
        • Буквы (A-Z, a-z)
        • Цифры (0-9)
        • Символы: . _ % + -
        • Длина: до 64 символов
  5. Город:
    • Формат: Москва, г. Москва

Варианты

  1. Посчитайте количество анкет мужчин в списке. Выведите их количество на экран и сохраните анкеты в новый файл.
  2. Посчитайте количество людей, родившихся в 21 веке. Выведите их количество на экран и сохраните анкеты в новый файл.
  3. Посчитайте количество людей возрастом от 30 до 40 лет. Выведите их количество на экран и сохраните анкеты в новый файл.
  4. Найдите самого старого и самого молодого человека. Выведите их возраст и анкеты на экран.
  5. Найдите всех людей с фамилией Иванов(а). Выведите их количество на экран и сохраните анкеты в новый файл.
  6. Найти всех людей с фамилиями, оканчивающимися на "ов(а)". Выведите их количество на экран и сохраните анкеты в новый файл.
  7. Найдите всех людей, чьи телефоны имеют код города 927. Выведите их количество на экран и сохраните их анкеты в новый файл.
  8. Найдите всех людей, проживающих в городе Москва. Выведите их количество на экран и сохраните их анкеты в новый файл.
  9. Посчитайте, какое имя встречается чаще всего. Выведите имя и количество повторений на экран.
  10. Найдите все женские имена, начинающиеся с буквы А. Выведите их количество на экран и сохраните анкеты в новый файл.
  11. Пользователь вводит имя человека. Подсчитайте количество людей с таким именем. Выведите их количество на экран и сохраните анкеты в новый файл.
  12. Определите, какой код оператора среди телефонных номеров встречается чаще всего. Выведите код и количество его повторений на экран.
  13. Найдите анкеты людей, у которых указан номер телефона (в корректном формате). Выведите их количество на экран и сохраните найденные анкеты в новый файл.
  14. Найдите анкеты людей, у которых указана почта (в корректном формате). Выведите их количество на экран и сохраните найденные анкеты в новый файл.
  15. Проверьте, что номера телефонов уникальны. Анкеты с дубликатами выведите на экран.
  16. Проверьте, что адреса почты уникальны. Анкеты с дубликатами выведите на экран.
  17. Проверьте, что все имена и фамилии начинаются с заглавной буквы. Если имя или фамилия начинаются со строчной буквы - исправьте это и сохраните результат в новый файл.
  18. Найдите номера телефонов с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
  19. Найдите адреса почты с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
  20. Найдите даты рождения с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
  21. Составьте список фамилий и имён в формате "Фамилия И.". Отсортируйте получившийся список в алфавитном порядке и сохраните в новый файл. Все имена и фамилии должны иметь корректный формат.
  22. Создайте список в формате "Фамилия: номер телефона" и сохраните его в новый файл. Все номера должны иметь корректный формат.
  23. Создайте список в формате "Фамилия: адрес почты" и сохраните его в новый файл. Все адреса должны иметь корректный формат.
  24. Создайте список в формате "Фамилия: дата рождения". Отсортируйте его по возрасту и сохраните в новый файл. Все даты рождения должны иметь корректный формат.
  25. Отсортируйте исходный список по фамилиям и именам в алфавитном порядке и сохраните результат в новый файл (структура списка не меняется).
  26. Приведите все данные к единому шаблону (любому из допустимых). Сохраните результат в новый файл. Если данные указаны некорректно - поставьте прочерк.
  27. Посчтиайте статистику по доменам адресов почты: создайте список в формате "Домен: количество", отсортируйте его по количеству людей и сохраните в новый файл.
  28. Посчитайте статистику по городам: посчитайте количиство людей из каждого города, создайте список в формате "Город: количество", отсортируйте его по количеству людей и алфавитному порядку и сохраните в новый файл.
  29. Посчитайте статистику по возрасту: создайте два списка - для мужчин и женщин, в формате "Диапазон - количество" и сохраните его в новый файл. Диапазоны для мужчин: 0-17, 18-64, 65+, для женщин: 0-17, 18-59, 60+.
  30. Схораните данные в виде таблицы в формате csv. Таблица должна содержать колонки: Фамилия, Имя, Пол, Дата рождения, Номер телефона (прочерк если нет), Почта (прочерк, если нет), Город. Если данные в колонке некорректны - поставьте прочерк.