Модуль 7
Строки и регулярные выражения: разбор бортового журнала
5 блок(ов) теории · 10 заданий · 155 баллов
Реальные данные приходят строками: строка журнала полёта, строка CSV-выгрузки, строка JSON. У строк в Python есть методы — функции, которые вызываются через точку: line.split(...). Метод split() без аргумента режет строку по пробелам, выбрасывая пустые куски: "12:00:01 ALT=45.2".split() — это список ["12:00:01", "ALT=45.2"]. С аргументом split режет по указанному разделителю, и пустые куски между соседними разделителями остаются: "a,b,,c".split(",") — это ["a", "b", "", "c"] — четыре элемента, и третий пустой: между двумя запятыми ничего нет. Метод strip() срезает пробельные символы (пробелы, табуляции, переводы строк) с обоих концов строки: " min.conf ".strip() — это "min.conf"; варианты rstrip(...) и lstrip(...) срезают только справа и только слева, причём с аргументом — лишь указанные символы: "45.2m".rstrip("m") — это "45.2". Проверки дают bool: "Betaflight".startswith("Beta") — это True, а оператор in отвечает на вопрос «есть ли подстрока внутри»: "warn" in "WARN low".lower() — это True, потому что метод lower() перевёл строку в нижний регистр. Менять регистр для сравнения — типовой приём: регистр в журналах не гарантирован. Из частей строку собирает метод join — его вызывает разделитель, а получает он список: " | ".join(["ARM", "thr=1520"]) — это "ARM | thr=1520", разделитель вставляется только между элементами. Помните: строки неизменяемы, каждый метод возвращает новую строку — результат надо запомнить: line = line.strip().
Когда разбор «на сплитах» перестаёт хватать — строка слишком пёстрая — включают регулярные выражения: язык шаблонов, который описывает форму строки, а не её точный текст. Модуль re из стандартной библиотеки подключается строкой import re. Функция re.search(шаблон, текст) ищет первое место, где текст подходит под шаблон: нашла — возвращает объект-совпадение, не нашла — None; проверка if match is None отделяет «поля нет» от «поле есть». В шаблоне у символов особые роли: \d — одна цифра, + после символа означает «один и более раз», \. — настоящая точка (одинокая точка . — «любой один символ», поэтому настоящую точку в числах экранируют слэшем), круглые скобки выделяют группу — часть совпадения, которую удобно достать: re.search(r"ALT=([\d.]+)", "[12:00:01] ALT=45.2m").group(1) — это "45.2"; group(0) — весь совпавший кусок, group(1) — первая скобка. Цифры и точки собирает класс [\d.] — «цифра или точка». Якоря привязывают шаблон к краям строки: ^ — начало, $ — конец, поэтому ^ALT=\d+$ подходит только строке, которая целиком и есть показание высоты. Литеру r перед кавычкой ставят, чтобы слэши доходили до регэкспа без искажений — такие строки называют сырыми. Два помощника на каждый день: re.findall(шаблон, текст) возвращает список всех совпадений (со скобочной группой — список групп), а re.sub(шаблон, замена, текст) заменяет каждое совпадение: re.sub(r"\d+\.\d+,\d+\.\d+", "[REDACTED]", text) прячет координаты вида 55.7522,37.6156.
Разбор строки журнала — это конвейер из четырёх шагов: срезать края (strip), разрезать на поля (split), привести каждое поле к настоящему типу (int, float) и собрать результат — например словарь из модуля 5: {"name": parts[0], "mass_g": int(parts[1])}. Порядок шагов важен: если разрезать до срезки, разделитель отрежет края вместе с пробелами, и первое поле получит вид " Модуль" с прилипшим пробелом — числа int и float пробелы по краям прощают, а вот сравнение строк — нет: " Модуль" == "Модуль" — это False, и запись не найдётся в справочнике. Приведение типов — часть контракта функции: словарь со значением "1150" (строка) и со значением 1150 (число) — разные вещи; аналогично f-строка из модуля 1 честно напечатает 1520.0 для дробного значения, поэтому число перед печатью приводят к int. Если поля в строке может не быть, честный ответ — None, а не падение программы: вернуть None и проверить результат через if result is None — так пишут разбор, который переживает мусорные строки.
Задания
0/10 заданий · 0/155 баллов
1. Четыре метода: split, strip, startswith
10 балл(ов)Разбор журнала начинается с базовых методов. Выберите вариант, где верно назван результат каждого выражения: "12:00:01 ALT=45.2".split(), " min.conf ".strip(), "Betaflight".startswith("Beta") и "a,b,,c".split(",") — в последнем обратите внимание на кусок между двумя соседними запятыми.