TGTGInsightаналитика telegramLIVE / telegram public index
← Системный сдвиг
Системный сдвиг avatar

TGINSIGHT POST

Post #293

@systemswing

Системный сдвиг

Просмотры2,750Количество просмотров
Опубликован2 февр.02.02.2024, 13:47
Содержимое поста

Содержимое

Регулярные выражения, RegEx или RegExp. Написал для участников тренинга, вдруг вам тоже пригодится. Интересно, что у аналитиков регулярно встречается запрос на SQL (и на собеседованиях дают задачки на него), а вот про регулярные выражения почему-то не вспоминают. То ли они аналитикам не нужны, то ли считается, что это знание "по умолчанию", ну что про них говорить :) Между тем, я вижу на курсах, что многие аналитики вообще про них не знают, а они начинают всплывать при интеграциях: при валидации параметров входящих сообщений (pattern в схеме данных в OpenAPI), при мэппинге данных, при указании имен файлов в файловом обмене. Это специальный язык, через который можно задать условия для текста. То есть, найти в тексте такую подстроку, которая удовлетворяет этим условиям. Для чего может использоваться: 🔹 проверка формата текстового значения (валидация — например, в json schema или xsd, причём валидировать можно как значения, так и названия полей); 🔹 поиск (например, в текстовом файле, CSV, таблице Excel или в БД); 🔹 извлечение подстроки из текста; 🔹 подсчет числа вхождений, соответствующих маске; 🔹 замена подстроки, подходящей под маску; 🔹 очистка данных (удаление кавычек, двойных пробелов, скобок и т.п., извлечение значений: ФИО, дат, телефонов, URL, email) Регэкспы распространены повсеместно: от утилиты командной строки grep, выполняющей поиск в файлах и постоянно использующейся программистами и админами (отсюда глагол "грепать", "грепнуть" — получить подмножество соответствующих строк из исходного файла), до библиотек во всех языках программирования, функций в SQL, инструментов поиска в текстовых редакторах и интернет-поисковиках. Синтаксис регулярных выражений стандартизован как часть стандарта POSIX. На практике чаще применяется более мощный PCRE, родом из языка Perl, так что в каждой конкретной системе синтаксис выражений может немного отличаться. Движки выполнения хорошо оптимизированы и работают быстро; под регулярными выражениями лежит хорошая математика, и в среднем их вычислительная сложность линейна — O(n) — но можно написать такое выражение, которое надолго завесит ваш поиск :) Язык задания паттернов в своей основе прост: — просто набор символов -> полное совпадение с учетом регистра (по умолчанию. можно отключить учёт регистра) — . -> любой символ — вертикальная палка | -> одно или другое: елка|ёлка — скобки -> область действия и последовательность операторов, как в математике: (е|ё)лка, Ната(л(ь|и)я|ша) — квадратные скобки -> любой из указанных символов: [её]лка, Натал[ьи]я, [0-9] - цифры, [A-Z] - буквы латиницы в верхнем регистре - [^] -> отрицание, символ, не входящий в набор: [^аеёиоуэюя] означает "любой символ, кроме гласных букв". Квантификаторы: ? -> ноль или один предыдущий символ: RegExp? найдет и RegEx, и RegExp * -> ноль или несколько предыдущих символов + -> один или несколько предыдущих символов {n} -> повтор предыдущего символа n раз. {n,m} - повтор от n до m раз ^ и $ -> начало и конец строки. \w — слово, \b — граница слова (но только для английского языка!). Пример: ^(?:\d{3}-){2}\d{4}$ - строка, содержащая телефонный номер. Или так: ^[0-9]{3}-[0-9]{3}-[0-9]{4}$. Дальше начинается сплошной драконий покер: можно искать слово X, за которым не следует слово Y; строки, в которых упоминается Z, но не упоминается W, и так далее. Инструмент невероятно мощный, можно с ним удивительные вещи делать. Правда, разобраться в уже готовых регэкспах бывает сложно, их обзывают write only, а выглядят они, как шифр на клингонском. Почитать вводную статью на русском: https://techrocks.ru/2022/05/31/regex-complete-guide/ Пройти подробнейший tutorial на английском: https://www.regular-expressions.info/tutorial.html Попробовать составить и поотлаживать регулярные выражения: https://regex101.com/ Вот тут примеры пожестче: https://habr.com/ru/articles/349860/ Кстати, ChatGPT умеет по текстовому описанию умеет строить регулярные выражения (но рекомендую проверять, как обычно — он может и ошибок насажать).