Skip to content

Практическая работа №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]) # P
print(text[1]) # y
print(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 += 1

5. Основные методы строк

МетодНазначение
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)

Для каждого задания необходимо:

  1. Определить входные и выходные данные.
  2. Составить алгоритм решения.
  3. При необходимости представить алгоритм в виде блок-схемы.
  4. Реализовать программу на языке Python.
  5. Проверить программу минимум на трёх наборах тестовых данных.
  6. Предусмотреть обработку пустых строк и граничных случаев, если это требуется условием.
  7. Не использовать регулярные выражения.
  8. Не создавать пользовательские функции: функции будут рассматриваться в следующей теме.
  9. В заданиях с файлами использовать конструкцию with open(...).

Задания для выполнения

Section titled “Задания для выполнения”

Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 15, варианты повторяются по кругу: 16-й студент выполняет вариант 1, 17-й — вариант 2 и т.д.

Каждый вариант включает пять заданий. Задания 1–4 являются обязательными. Задание 5 является комплексным и выполняется после основной части работы.

№Тип задачиОписание задачи
1Нормализация строкиПользователь вводит имя узла. Удалите пробелы по краям, переведите строку в нижний регистр и выведите её длину.
2Анализ символовДля введённого имени узла подсчитайте количество букв, цифр и символов -.
3Разбор строкиДана строка srv01 192.168.1.10 online. Выведите имя узла, IP-адрес и состояние отдельными строками.
4Проверка форматаПроверьте, заканчивается ли введённое полное имя узла на .local и начинается ли оно с srv.
5ФайлПрочитайте events.log, запишите в errors.log только строки со словом ERROR без учёта регистра и выведите количество найденных строк.

Содержимое файла events.log:

INFO: system started
ERROR: network interface is down
WARNING: high CPU load
error: authentication failed
INFO: backup completed
ERROR: disk space is low
NOTICE: configuration reloaded
№Тип задачиОписание задачи
1ПреобразованиеПользователь вводит имя пользователя. Удалите пробелы по краям, замените пробелы внутри на _ и переведите строку в нижний регистр.
2СрезыВыведите первые три и последние три символа введённой строки, а также строку в обратном порядке.
3ПоискОпределите, содержит ли системное сообщение слова warning, error или critical без учёта регистра.
4ПодсчётПодсчитайте количество символов _ и цифр в имени пользователя.
5ФайлВ users.txt находятся имена пользователей. Создайте normalized_users.txt, записав имена без пробелов по краям и в нижнем регистре.

Содержимое файла users.txt:

Admin
Student01
NETWORK_USER
Guest
Operator02
Test User
№Тип задачиОписание задачи
1Индексация и срезыПользователь вводит строку. Выведите первый, последний, второй и предпоследний символы, затем первые четыре символа.
2ПалиндромОпределите, является ли введённое слово палиндромом без учёта регистра.
3Разбор параметраДана строка port=8080. Выведите имя параметра и его значение.
4Проверка значенияПроверьте, состоит ли значение после символа = только из цифр.
5ФайлПрочитайте config.txt и создайте active.txt, исключив пустые строки и строки, начинающиеся с #.

Содержимое файла config.txt:

# Server configuration
host=192.168.1.10
port=8080
# Logging
log_level=warning
timeout=30
enabled=true
№Тип задачиОписание задачи
1Анализ символовПользователь вводит строку. Подсчитайте количество букв, цифр, пробелов и остальных символов.
2Расширение файлаПользователь вводит имя файла. Определите, заканчивается ли оно на .log, .txt или .conf.
3ЗаменаЗамените в имени файла все пробелы на символ _ и переведите результат в нижний регистр.
4Поиск позицииНайдите позицию первой точки в имени файла. Если точки нет, выведите сообщение.
5ФайлВ services.txt находятся строки вида ssh:active. Выведите активные службы и подсчитайте их количество.

Содержимое файла services.txt:

ssh:active
nginx:inactive
postgresql:active
docker:active
apache2:inactive
cron:active
№Тип задачиОписание задачи
1Поиск подстрокиПользователь вводит сообщение и искомое слово. Подсчитайте количество вхождений слова без учёта регистра.
2ПреобразованиеСтроку SERVER-ROOM-01 приведите к виду server_room_01.
3СрезыВыведите первые шесть символов преобразованной строки и последние два символа.
4ПроверкаОпределите, содержит ли строка хотя бы одну цифру.
5ФайлПрочитайте messages.log и создайте warnings.log, содержащий строки с WARNING без учёта регистра. Выведите количество таких строк.

Содержимое файла messages.log:

INFO: service started
WARNING: memory usage is high
INFO: user logged in
warning: temperature increased
ERROR: connection refused
WARNING: backup was delayed
INFO: service stopped
№Тип задачиОписание задачи
1Проверка пароляПользователь вводит пароль. Определите длину и наличие хотя бы одной цифры.
2Анализ пароляПодсчитайте количество букв верхнего и нижнего регистра.
3Разбор адресаДана строка admin@example.local. Выведите имя пользователя и доменную часть.
4Проверка доменаОпределите, заканчивается ли адрес на .local.
5ФайлВ hosts.txt находятся имена узлов. Запишите в servers.txt только строки, начинающиеся с srv без учёта регистра.

Содержимое файла hosts.txt:

srv01
pc-101
SRV02
router-main
srv-backup
printer01
Srv03
№Тип задачиОписание задачи
1ИндексацияПользователь вводит строку длиной не менее 5 символов. Выведите второй, предпоследний и средний символ.
2СрезыВыведите символы с чётными индексами и затем символы с нечётными индексами.
3Анализ сообщенияПроверьте, начинается ли строка журнала с ERROR: и заканчивается ли точкой.
4ЗаменаЗамените ERROR: на CRITICAL:.
5ФайлПрочитайте commands.txt и создайте long_commands.txt, содержащий команды длиной более 20 символов.

Содержимое файла commands.txt:

pwd
ls -la
systemctl status nginx
ip address show
cat /etc/os-release
journalctl --since today
df -h
№Тип задачиОписание задачи
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;up
eth1;192.168.2.10;down
wlan0;192.168.10.15;up
docker0;172.17.0.1;up
eth2;10.0.0.5;down
№Тип задачиОписание задачи
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
№Тип задачиОписание задачи
1Подсчёт символовПодсчитайте количество точек и двоеточий во введённой строке.
2Проверка имениПроверьте, начинается ли имя узла с pc, srv или router без учёта регистра.
3НормализацияПриведите имя узла к нижнему регистру и удалите пробелы по краям.
4Разбор FQDNДля строки srv01.example.local выведите имя узла и доменную часть.
5ФайлВ access.log находятся строки журнала. Запишите в denied.log строки со словом DENIED и подсчитайте их количество.

Содержимое файла access.log:

192.168.1.10 ALLOWED ssh
192.168.1.15 DENIED ssh
192.168.1.20 ALLOWED http
192.168.1.33 DENIED ftp
192.168.1.45 DENIED telnet
192.168.1.50 ALLOWED https
№Тип задачиОписание задачи
1СрезыВыведите символы с чётными и нечётными индексами введённой строки.
2НормализацияСтроку SRV01.EXAMPLE.LOCAL приведите к виду srv01.example.local.
3Подсчёт частейПодсчитайте количество символов . в доменном имени.
4ПроверкаОпределите, заканчивается ли доменное имя на .local.
5ФайлВ domains.txt находятся доменные имена. Создайте local.txt, содержащий только имена, оканчивающиеся на .local.

Содержимое файла domains.txt:

srv01.example.local
google.com
printer.office.local
example.org
dc01.corp.local
mail.example.com
backup.local
№Тип задачиОписание задачи
1Проверка составаОпределите, состоит ли введённая строка только из цифр, только из букв или содержит разные типы символов.
2Разбор параметраСтроку timeout = 30 разделите на имя параметра и значение, удалив лишние пробелы.
3Проверка значенияОпределите, является ли значение параметра целым неотрицательным числом.
4ФорматированиеВыведите результат в виде Параметр timeout имеет значение 30.
5ФайлПрочитайте settings.conf и подсчитайте количество непустых строк, не начинающихся с #.

Содержимое файла settings.conf:

# Main settings
host = 192.168.1.10
port = 8080
# Timeouts
timeout = 30
retries = 5
debug = false
№Тип задачиОписание задачи
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_SUCCESS
192.168.1.15 LOGIN_FAILED
192.168.1.20 LOGIN_SUCCESS
192.168.1.15 LOGIN_FAILED
192.168.1.30 LOGIN_FAILED
192.168.1.40 LOGIN_SUCCESS
192.168.1.50 LOGIN_FAILED
№Тип задачиОписание задачи
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
№Тип задачиОписание задачи
1Очистка строкиПользователь вводит строку. Удалите пробелы по краям.
2Нормализация пробеловПреобразуйте несколько пробелов между словами в один пробел с помощью split() и join().
3Формирование имениПользователь вводит имя узла и домен. Сформируйте hostname.domain.
4Проверка имениОпределите, содержит ли сформированное имя только допустимые для этой задачи символы: буквы, цифры, дефисы и точки. Проверку выполните перебором символов.
5ФайлПрочитайте status.log, создайте offline.log со строками, содержащими offline без учёта регистра, и выведите количество найденных записей.

Содержимое файла status.log:

srv01 online
srv02 offline
router-main ONLINE
printer01 offline
srv-backup Offline
pc-101 online
dc01 ONLINE
  1. Что представляет собой строка в Python?
  2. Как получить длину строки?
  3. Чем положительные индексы отличаются от отрицательных?
  4. Для чего используются срезы?
  5. Что означает запись text[::-1]?
  6. Почему строку называют неизменяемым типом данных?
  7. Для чего используются strip(), lower() и upper()?
  8. Чем оператор in отличается от метода find()?
  9. Для чего используется replace()?
  10. Что возвращает split()?
  11. Для чего применяется join()?
  12. Как выполнить поиск без учёта регистра?
  13. Для чего используются startswith() и endswith()?
  14. Чем isdigit(), isalpha() и isalnum() отличаются друг от друга?
  15. Как совместить обработку строк с построчным чтением файла?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Python Documentation — Strings
  2. Python Documentation — Text Sequence Type str
  3. Python Documentation — Input and Output