Практическая работа №5
Цель работы: Научиться выполнять обработку строковых данных средствами Python: получать отдельные символы и фрагменты строк, выполнять поиск, замену, проверку, разделение и объединение текста, а также применять строковые методы при обработке системных и журнальных данных.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Строки в Python
Строка — последовательность символов. Строковые значения имеют тип str.
hostname = "srv01.example.local"message = "ERROR: connection failed"Длина строки:
print(len(hostname))Строки в Python являются неизменяемыми. Любая операция изменения фактически создаёт новую строку.
2. Индексация строк
text = "Python"
print(text[0]) # Pprint(text[1]) # yprint(text[-1]) # nПоложительная индексация начинается с 0, отрицательная — с -1 от конца строки.
3. Срезы
text = "192.168.1.10"
print(text[0:3])print(text[:7])print(text[8:])print(text[::-1])Общий вид:
string[start:stop:step]4. Перебор символов
text = "server01"
for symbol in text: print(symbol)Например, подсчёт цифр:
count = 0
for symbol in text: if symbol.isdigit(): count += 15. Основные методы строк
| Метод | Назначение |
|---|---|
lower() | перевод в нижний регистр |
upper() | перевод в верхний регистр |
strip() | удаление пробелов и переводов строк по краям |
replace(old, new) | замена фрагмента |
find(value) | поиск позиции подстроки |
count(value) | подсчёт вхождений |
startswith(value) | проверка начала строки |
endswith(value) | проверка окончания строки |
isdigit() | проверка, состоит ли строка из цифр |
isalpha() | проверка, состоит ли строка из букв |
isalnum() | проверка, состоит ли строка только из букв и цифр |
6. Проверка наличия подстроки
message = "ERROR: connection failed"
if "ERROR" in message: print("Обнаружена ошибка")Поиск без учёта регистра:
if "error" in message.lower(): print("Обнаружена ошибка")7. Разделение и объединение строк
line = "192.168.1.15 LOGIN_FAILED"
parts = line.split()
print(parts[0])print(parts[1])Разделитель можно указать явно:
line = "srv01;192.168.1.10;online"parts = line.split(";")Объединение строк:
parts = ["srv01", "example", "local"]hostname = ".".join(parts)В данной работе split() и join() используются как инструменты обработки строк. Подробная работа со списками будет рассмотрена в следующей теме.
8. Форматирование строк
hostname = "srv01"ip = "192.168.1.10"
print(f"Узел {hostname}: {ip}")9. Обработка строк из файла
with open("events.log", "r", encoding="utf-8") as file: for line in file: line = line.strip()
if "error" in line.lower(): print(line)Общие требования
Section titled “Общие требования”Для каждого задания необходимо:
- Определить входные и выходные данные.
- Составить алгоритм решения.
- При необходимости представить алгоритм в виде блок-схемы.
- Реализовать программу на языке Python.
- Проверить программу минимум на трёх наборах тестовых данных.
- Предусмотреть обработку пустых строк и граничных случаев, если это требуется условием.
- Не использовать регулярные выражения.
- Не создавать пользовательские функции: функции будут рассматриваться в следующей теме.
- В заданиях с файлами использовать конструкцию
with open(...).
Задания для выполнения
Section titled “Задания для выполнения”Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 15, варианты повторяются по кругу: 16-й студент выполняет вариант 1, 17-й — вариант 2 и т.д.
Каждый вариант включает пять заданий. Задания 1–4 являются обязательными. Задание 5 является комплексным и выполняется после основной части работы.
Вариант 1
Section titled “Вариант 1”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Нормализация строки | Пользователь вводит имя узла. Удалите пробелы по краям, переведите строку в нижний регистр и выведите её длину. |
| 2 | Анализ символов | Для введённого имени узла подсчитайте количество букв, цифр и символов -. |
| 3 | Разбор строки | Дана строка srv01 192.168.1.10 online. Выведите имя узла, IP-адрес и состояние отдельными строками. |
| 4 | Проверка формата | Проверьте, заканчивается ли введённое полное имя узла на .local и начинается ли оно с srv. |
| 5 | Файл | Прочитайте events.log, запишите в errors.log только строки со словом ERROR без учёта регистра и выведите количество найденных строк. |
Содержимое файла events.log:
INFO: system startedERROR: network interface is downWARNING: high CPU loaderror: authentication failedINFO: backup completedERROR: disk space is lowNOTICE: configuration reloadedВариант 2
Section titled “Вариант 2”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Преобразование | Пользователь вводит имя пользователя. Удалите пробелы по краям, замените пробелы внутри на _ и переведите строку в нижний регистр. |
| 2 | Срезы | Выведите первые три и последние три символа введённой строки, а также строку в обратном порядке. |
| 3 | Поиск | Определите, содержит ли системное сообщение слова warning, error или critical без учёта регистра. |
| 4 | Подсчёт | Подсчитайте количество символов _ и цифр в имени пользователя. |
| 5 | Файл | В users.txt находятся имена пользователей. Создайте normalized_users.txt, записав имена без пробелов по краям и в нижнем регистре. |
Содержимое файла users.txt:
AdminStudent01 NETWORK_USERGuest Operator02Test UserВариант 3
Section titled “Вариант 3”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Индексация и срезы | Пользователь вводит строку. Выведите первый, последний, второй и предпоследний символы, затем первые четыре символа. |
| 2 | Палиндром | Определите, является ли введённое слово палиндромом без учёта регистра. |
| 3 | Разбор параметра | Дана строка port=8080. Выведите имя параметра и его значение. |
| 4 | Проверка значения | Проверьте, состоит ли значение после символа = только из цифр. |
| 5 | Файл | Прочитайте config.txt и создайте active.txt, исключив пустые строки и строки, начинающиеся с #. |
Содержимое файла config.txt:
# Server configurationhost=192.168.1.10port=8080
# Logginglog_level=warningtimeout=30
enabled=trueВариант 4
Section titled “Вариант 4”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Анализ символов | Пользователь вводит строку. Подсчитайте количество букв, цифр, пробелов и остальных символов. |
| 2 | Расширение файла | Пользователь вводит имя файла. Определите, заканчивается ли оно на .log, .txt или .conf. |
| 3 | Замена | Замените в имени файла все пробелы на символ _ и переведите результат в нижний регистр. |
| 4 | Поиск позиции | Найдите позицию первой точки в имени файла. Если точки нет, выведите сообщение. |
| 5 | Файл | В services.txt находятся строки вида ssh:active. Выведите активные службы и подсчитайте их количество. |
Содержимое файла services.txt:
ssh:activenginx:inactivepostgresql:activedocker:activeapache2:inactivecron:activeВариант 5
Section titled “Вариант 5”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Поиск подстроки | Пользователь вводит сообщение и искомое слово. Подсчитайте количество вхождений слова без учёта регистра. |
| 2 | Преобразование | Строку SERVER-ROOM-01 приведите к виду server_room_01. |
| 3 | Срезы | Выведите первые шесть символов преобразованной строки и последние два символа. |
| 4 | Проверка | Определите, содержит ли строка хотя бы одну цифру. |
| 5 | Файл | Прочитайте messages.log и создайте warnings.log, содержащий строки с WARNING без учёта регистра. Выведите количество таких строк. |
Содержимое файла messages.log:
INFO: service startedWARNING: memory usage is highINFO: user logged inwarning: temperature increasedERROR: connection refusedWARNING: backup was delayedINFO: service stoppedВариант 6
Section titled “Вариант 6”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Проверка пароля | Пользователь вводит пароль. Определите длину и наличие хотя бы одной цифры. |
| 2 | Анализ пароля | Подсчитайте количество букв верхнего и нижнего регистра. |
| 3 | Разбор адреса | Дана строка admin@example.local. Выведите имя пользователя и доменную часть. |
| 4 | Проверка домена | Определите, заканчивается ли адрес на .local. |
| 5 | Файл | В hosts.txt находятся имена узлов. Запишите в servers.txt только строки, начинающиеся с srv без учёта регистра. |
Содержимое файла hosts.txt:
srv01pc-101SRV02router-mainsrv-backupprinter01Srv03Вариант 7
Section titled “Вариант 7”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Индексация | Пользователь вводит строку длиной не менее 5 символов. Выведите второй, предпоследний и средний символ. |
| 2 | Срезы | Выведите символы с чётными индексами и затем символы с нечётными индексами. |
| 3 | Анализ сообщения | Проверьте, начинается ли строка журнала с ERROR: и заканчивается ли точкой. |
| 4 | Замена | Замените ERROR: на CRITICAL:. |
| 5 | Файл | Прочитайте commands.txt и создайте long_commands.txt, содержащий команды длиной более 20 символов. |
Содержимое файла commands.txt:
pwdls -lasystemctl status nginxip address showcat /etc/os-releasejournalctl --since todaydf -hВариант 8
Section titled “Вариант 8”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Регистры | Пользователь вводит строку. Выведите её в нижнем и верхнем регистрах, а также длину строки. |
| 2 | Разбор строки | Дана запись eth0;192.168.1.1;up. Выведите имя интерфейса, адрес и состояние. |
| 3 | Проверка | Проверьте, является ли состояние равным up без учёта регистра. |
| 4 | Формирование строки | Сформируйте строку вида Интерфейс eth0 имеет адрес 192.168.1.1 и состояние up. |
| 5 | Файл | Прочитайте interfaces.txt, где поля разделены ;, и запишите в down.txt строки, у которых состояние равно down. |
Содержимое файла interfaces.txt:
eth0;192.168.1.10;upeth1;192.168.2.10;downwlan0;192.168.10.15;updocker0;172.17.0.1;upeth2;10.0.0.5;downВариант 9
Section titled “Вариант 9”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Замена | Пользователь вводит строку. Удалите пробелы по краям и замените пробелы внутри на дефисы. |
| 2 | Поиск позиции | Найдите позицию первого символа : в строке вида ERROR: Disk full. |
| 3 | Разделение | Разделите сообщение на тип события и текст события по первому символу :. |
| 4 | Подсчёт | Подсчитайте количество букв o без учёта регистра. |
| 5 | Файл | Из log.txt сформируйте clean.log, удалив пустые строки и пробелы по краям каждой строки. |
Содержимое файла log.txt:
INFO: service started
WARNING: high load ERROR: disk full
INFO: backup completed NOTICE: configuration changedВариант 10
Section titled “Вариант 10”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Подсчёт символов | Подсчитайте количество точек и двоеточий во введённой строке. |
| 2 | Проверка имени | Проверьте, начинается ли имя узла с pc, srv или router без учёта регистра. |
| 3 | Нормализация | Приведите имя узла к нижнему регистру и удалите пробелы по краям. |
| 4 | Разбор FQDN | Для строки srv01.example.local выведите имя узла и доменную часть. |
| 5 | Файл | В access.log находятся строки журнала. Запишите в denied.log строки со словом DENIED и подсчитайте их количество. |
Содержимое файла access.log:
192.168.1.10 ALLOWED ssh192.168.1.15 DENIED ssh192.168.1.20 ALLOWED http192.168.1.33 DENIED ftp192.168.1.45 DENIED telnet192.168.1.50 ALLOWED httpsВариант 11
Section titled “Вариант 11”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Срезы | Выведите символы с чётными и нечётными индексами введённой строки. |
| 2 | Нормализация | Строку SRV01.EXAMPLE.LOCAL приведите к виду srv01.example.local. |
| 3 | Подсчёт частей | Подсчитайте количество символов . в доменном имени. |
| 4 | Проверка | Определите, заканчивается ли доменное имя на .local. |
| 5 | Файл | В domains.txt находятся доменные имена. Создайте local.txt, содержащий только имена, оканчивающиеся на .local. |
Содержимое файла domains.txt:
srv01.example.localgoogle.comprinter.office.localexample.orgdc01.corp.localmail.example.combackup.localВариант 12
Section titled “Вариант 12”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Проверка состава | Определите, состоит ли введённая строка только из цифр, только из букв или содержит разные типы символов. |
| 2 | Разбор параметра | Строку timeout = 30 разделите на имя параметра и значение, удалив лишние пробелы. |
| 3 | Проверка значения | Определите, является ли значение параметра целым неотрицательным числом. |
| 4 | Форматирование | Выведите результат в виде Параметр timeout имеет значение 30. |
| 5 | Файл | Прочитайте settings.conf и подсчитайте количество непустых строк, не начинающихся с #. |
Содержимое файла settings.conf:
# Main settingshost = 192.168.1.10port = 8080
# Timeoutstimeout = 30retries = 5
debug = falseВариант 13
Section titled “Вариант 13”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Палиндром | Определите, является ли введённое слово палиндромом без учёта регистра. |
| 2 | Разбор журнала | Строку 192.168.1.15 LOGIN_FAILED разделите на адрес и событие. |
| 3 | Проверка события | Проверьте, является ли событие LOGIN_FAILED. |
| 4 | Замена | Замените в строке LOGIN_FAILED символ _ на пробел и переведите результат в нижний регистр. |
| 5 | Файл | Прочитайте auth.log, подсчитайте строки с LOGIN_FAILED и запишите их в failed.log. |
Содержимое файла auth.log:
192.168.1.10 LOGIN_SUCCESS192.168.1.15 LOGIN_FAILED192.168.1.20 LOGIN_SUCCESS192.168.1.15 LOGIN_FAILED192.168.1.30 LOGIN_FAILED192.168.1.40 LOGIN_SUCCESS192.168.1.50 LOGIN_FAILEDВариант 14
Section titled “Вариант 14”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Подсчёт букв | Подсчитайте количество гласных английских букв во введённой строке без учёта регистра. |
| 2 | Путь к файлу | Для строки /var/log/nginx/access.log выведите имя файла. |
| 3 | Проверка расширения | Проверьте, имеет ли имя файла расширение .log. |
| 4 | Замена | Замените символ / на -> и выведите преобразованный путь. |
| 5 | Файл | В paths.txt находятся пути к файлам. Запишите в logs.txt только строки, оканчивающиеся на .log. |
Содержимое файла paths.txt:
/var/log/nginx/access.log/etc/hosts/var/log/auth.log/home/student/data.txt/var/log/syslog/opt/app/error.log/etc/network/interfacesВариант 15
Section titled “Вариант 15”| № | Тип задачи | Описание задачи |
|---|---|---|
| 1 | Очистка строки | Пользователь вводит строку. Удалите пробелы по краям. |
| 2 | Нормализация пробелов | Преобразуйте несколько пробелов между словами в один пробел с помощью split() и join(). |
| 3 | Формирование имени | Пользователь вводит имя узла и домен. Сформируйте hostname.domain. |
| 4 | Проверка имени | Определите, содержит ли сформированное имя только допустимые для этой задачи символы: буквы, цифры, дефисы и точки. Проверку выполните перебором символов. |
| 5 | Файл | Прочитайте status.log, создайте offline.log со строками, содержащими offline без учёта регистра, и выведите количество найденных записей. |
Содержимое файла status.log:
srv01 onlinesrv02 offlinerouter-main ONLINEprinter01 offlinesrv-backup Offlinepc-101 onlinedc01 ONLINEКонтрольные вопросы
Section titled “Контрольные вопросы”- Что представляет собой строка в Python?
- Как получить длину строки?
- Чем положительные индексы отличаются от отрицательных?
- Для чего используются срезы?
- Что означает запись
text[::-1]? - Почему строку называют неизменяемым типом данных?
- Для чего используются
strip(),lower()иupper()? - Чем оператор
inотличается от методаfind()? - Для чего используется
replace()? - Что возвращает
split()? - Для чего применяется
join()? - Как выполнить поиск без учёта регистра?
- Для чего используются
startswith()иendswith()? - Чем
isdigit(),isalpha()иisalnum()отличаются друг от друга? - Как совместить обработку строк с построчным чтением файла?