Регулярные выражения в excel
Функция ПОДСТАВИТЬ позволяет заменить все вхождения или N-ное вхождение подстроки в тексте на другой текст. Подстрокой может быть как один символ, так и несколько.
Функция является в некоторой степени аналогом процедуры Найти и Заменить в Excel, с некоторыми отличиями:
- Что очевидно и является базовым отличием, она является функцией, т.е. пересчитывается автоматически, в отличие от одноразового характера процедур, и выводит результат в другую ячейку, в то время, как процедура меняет результат на месте;
- Функция ПОДСТАВИТЬ всегда чувствительна к регистру. В процедуре «найти и заменить» чувствительность к регистру опциональна;
- Функция не поддерживает подстановочные символы («*» и «?»);
- Зато позволяет осуществлять массовую замену нескольких (до 64 в последней версии Excel) значений одновременно;
- Еще одно преимущество функции в том, что она позволяет заменить не все вхождения, а определенное по порядку в строке, чего не позволяет сделать процедура.
Синтаксис
Последний аргумент является необязательным (поэтому указан в квадратных скобках в примере), если его не указывать, будут заменены все вхождения.
Форматирование
Характерные особенности функции ПОДСТАВИТЬ:
- Пустая ячейка воспринимается как строка нулевой длины («»).
- Логические значения конвертируются в текст с сохранением регистра.
- Все вариации числовых форматов (дата, время, дата-время, проценты, финансовый формат) конвертируются в соответствующее им натуральное число в текстовом формате, поэтому для сохранения исходного форматирования может понадобиться функция ТЕКСТ.
Примеры
Функция ПОДСТАВИТЬ необычайно популярна и может использоваться:
- по прямому назначению, когда необходимым результатом является сама строка с заменнными фрагментами
- как вспомогательная функция в сложносоставных формулах, когда результатом вычислений является даже не строка, а число или логическое значение
Рассмотрю несколько примеров ситуаций, в которых лично использовал функцию.
ПОДСТАВИТЬ с несколькими условиями (транслитерация)
Заменить кириллицу на транслит автоматически с помощью формулы? Можно! Правда, длина формулы настолько велика, что ее лучше сохранить где-нибудь, а не составлять самостоятельно. Потому что это формула с 64 условиями (уровнями вложенности). Подробнее — по ссылке в начале этого абзаца.
ПОДСТАВИТЬ, чтобы посчитать слова
Тот случай, когда функция используется не по своему назначению, т.к. целевым значением является число, а не текст. Лайфхак стар как мир, но не теряет своей актуальности.
Сколько слов в ячейке? На 1 больше, чем пробелов между ними. Это будет справедливо всегда, если разделителем слов считается только пробел, и если пробелов между каждыми двумя словами не более 1. Чтобы обезопасить себя от лишних, можно воспользоваться функцией СЖПРОБЕЛЫ.
Как посчитать пробелы в строке? Как и любой символ, можно посчитать их, подсчитав длину строки с ними и без них, и вычислив разницу. Как получить строку без них? Конечно, с помощью функции ПОДСТАВИТЬ.
Так будет выглядеть формула для ячейки A1, учитывающая все эти нюансы. ДЛСТР измеряет длину строк:
У формулы есть побочный эффект — для пустой ячейки она возвращает 1, поэтому, если пустые ячейки могут присутствовать, формулу выше придется «обернуть» выражением с Excel функцией ЕСЛИ:
Заменить пробелы на переносы строк
Часто возникает задача заменить пробелы в строке на переносы строк, и наоборот. Здесь будет полезна комбинация функций ПОДСТАВИТЬ и СИМВОЛ. Так будет выглядеть формула, заменяющая все пробелы в строке на переносы строк.
Как видно из формулы, код символа переноса строки — 10.
Обратите внимание, что результат может отображаться сплошной строкой, если не включить опцию «Перенести текст».
Отображение переносов строк в Excel
ПОДСТАВИТЬ, чтобы посчитать встречаемость в тексте
Узнать, сколько раз встречается фрагмент в тексте, можно довольно просто с помощью комбинации функций ПОДСТАВИТЬ и ДЛСТР.
- Первая (ПОДСТАВИТЬ) позволяет создать строку без указанного фрагмента, заменяя его на пустоту.
- Вторая (ДЛСТР) — измерить длину результата.
- Если вычесть из исходной длины полученную, и разделить на длину этого фрагмента, можно получить его встречаемость.
- Если заведомо известно, что это один символ, процесс деления можно опустить, т.к. результат от деления на 1 не изменится.
Так выглядит формула, считающая в ячейке A1 количество 1-символьного фрагмента из ячейки B1:
Так — для подсчета встречаемости конкретного символа в ячейке, в данном случае — косой черты, что позволяет, например, посчитать уровень вложенности директории по ее адресу:
А так — для фрагмента длиной более 1 символа, например, если нужно посчитать, сколько раз встречается конкретное слово в тексте:
ПОДСТАВИТЬ для подсчета цифр в тексте
Представим, что наша задача — провалидировать список номеров телефонов на количество цифр в нем. Корректным будем считать номер, в котором 11 цифр.
При этом номер может быть указан в любом формате — со скобками, дефисами, плюсом в начале, с пробелами и без. Помимо самого номера в строке могут присутствовать другие пометки, например, контактное лицо, является телефон мобильным или нет.
Очевидно, что функция ДЛСТР не подойдет в таком случае, как и не удастся сходу удалить все лишние символы, чтобы оставить в ячейках только цифры.
Комбинация функций ПОДСТАВИТЬ и ДЛСТР в формуле массива с функцией СУММ позволит решить данную задачу:
Многие слышали, что такое регулярные выражения, но не всем известно, что они поддерживаются «под капотом» Microsoft Excel. Регулярные выражения дают возможность многократно ускорить работу с текстом, находить в нем самые замысловатые паттерны и решать самые сложные исследовательские задачи. Единственная проблема в том, что для их использования в Excel необходимо знание VBA.
Почему Microsoft не включила их как функции листа и включит ли когда-нибудь, непонятно и неизвестно.
Но с надстройкой !SEMTools эти знания не нужны. Зато минимальное понимание синтаксиса регулярок позволит с легкостью решать задачи, решение которых практически невозможно с помощью стандартных функций, либо требуются формулы огромной длины. Примеры таких мегаформул можно посмотреть в решении задач:
Функции регулярных выражений в Excel
Для поддержки регулярных выражений при наличии подключенной надстройки !SEMTools в Excel будут работать 3 функции — REGEXMATCH, REGEXEXTRACT и REGEXREPLACE.
Их синтаксис и принцип работы аналогичен синтаксису Google Spreadsheets. Поэтому формулы, составленные в Excel, будут иметь полную зеркальную совместимость с Google Spreadsheets.
REGEXMATCH возвращает Истина или Ложь (TRUE или FALSE в английской версии Excel), в зависимости от того, соответствует текст паттерну или нет.
REGEXEXTRACT извлекает первый попадающий под паттерн фрагмент текста. Небольшое отличие от Google Spreadsheets — если в искомом тексте такого фрагмента нет, Spreadsheets отдают ошибку, а в надстройке отдается пустая строка.
Примеры задач, решаемых с помощью регулярных выражений
Я не поскуплюсь на примеры, чтобы показать вам все возможности регулярных выражений, т.к. они действительно масштабны. Надеюсь, эта статья послужит руководством и призывом активнее пользоваться их мощью. От простого к сложному.
Чтобы дать обычным пользователям Excel возможность на полную мощность использовать возможности регулярных выражений, в надстройку !SEMTools был добавлен ряд быстрых процедур. Все примеры ниже будут показаны с их использованием.
Извлечение данных из ячеек с помощью RegEx
Извлечь из ячейки содержимое до / после первой цифры включительно
Такие простые два выражения. «+» — это служебный символ-квантификатор. Он обеспечивает «жадный» режим, при котором берутся все удовлетворяющие выражению символы до тех пор, пока на пути не встретится не удовлетворяющий ему, или конец\начало строки. Точка обозначает любой символ, таким образом, берутся любые символы до конца строки, перед которыми есть цифра.
«\d». d обозначает «digits», иначе, цифры. Поскольку квантификатора после \d в примерах выше нет, то одну. Если потребуется исключить из результатов эту цифру, это можно сделать позднее. В !SEMTools есть простые способы удалить символы в начале или конце ячейки.
Цифры можно выразить и другим регулярным выражением:
«Вытянуть» цифры из ячеек
Как извлечь из строки цифры? Регулярное выражение для такой операции будет безумно простым:
В зависимости от режима извлечения, результатом будет либо первая, либо все цифры в ячейке.
Если их нужно вывести не сплошной последовательностью, а через разделитель, сохранив фрагменты, где символы следовали друг за другом, выражение будет чуть иным, с «жадным» квантификатором. А при извлечении нужно будет использовать разделитель.
Это справедливо и для любых других символов, пример с числами ниже:
Извлечь из ячейки числа из N цифр
Как видно в примере выше, помимо чисел, обозначающих годы, были извлечены и другие числа, например, 1. Чтобы извлечь исключительно последовательности из 4 цифр, потребуется видоизменить выражение. Есть несколько вариантов:
Последние два варианта включают квантификатор фигурные скобки. Он указывает минимальное количество повторений удовлетворяющего паттерну символа или фрагмента строки. Паттерну, стоящему непосредственно перед квантификатором. В данном случае подряд должны идти любые 4 символа, являющиеся цифрами.
Извлекаем все 4-цифровые последовательности (год) через разделитель
Извлечь латиницу регулярным выражением
Выражение «[a-zA-Z]» обозначает все символы латиницы. Дефис и в этом, и в предыдущем случае обозначает, что берутся все символы между a и z и между A и Z в общей таблице символов Unicode. Квадратные скобки — синоним «ИЛИ». Каждый из элементов или множеств внутри квадратных скобок рассматривается, и выражение не находит ничего, только если сравниваемая строка не содержит ни одного элемента внутри квадратных скобок.
Извлекаем латиницу с помощью регулярных выражений
Извлечь символы в конце/начале строк по условию
Стандартные формулы ПРАВСИМВ и ЛЕВСИМВ позволяют извлечь из ячейки соответственно последние и первые N символов, но на этом их возможности заканчиваются.
С помощью регулярных выражений можно извлечь:
- символы, идущие после и включая последнюю заглавную букву в ячейке, заканчивающейся на восклицательный знак. Так мы извлечем из ячеек все восклицательные предложения. Выражение — «[А-Я][а-яa-z0-9 ]+!$»
- первые N выбранных символов из определенного множества, если ячейка с них начинается
- аналогично, последние N определенных символов, если ячейка на них заканчивается
Проверить ячейки на соответствие регулярному выражению
Если нет необходимости извлекать данные, а нужно лишь проверить, соответствуют ли они паттерну, чтобы потом отфильтровать их, удобнее использовать процедуру, эквивалентную формуле REGEXMATCH.
Найти в ячейке числа из N цифр
В зависимости от того, является N необходимым или достаточным условием, нужны разные регулярные выражения. Иными словами, считать ли последовательности из N+1, N+2 и т.д. цифр подходящими или нет. Если да — выражение будет таким же, как уже указывалось выше:
Если же нас интересуют строго последовательности из N цифр, задачу придется производить в 2 итерации:
- В первую итерацию извлекать цифры вместе с границами строк или нецифровыми символами, идущими после/перед (это станет своеобразной проверкой отсутствия других цифр)
- И во вторую уже сами цифры.
Выражения для первой итерации будут, соответственно:
Если внимательно посмотреть на отличие в синтаксисе, можно понять, что означают символы в нем:
- вертикальная черта «|» обозначает «ИЛИ»
- скобки нужны для перечисления внутри них аргументов и «отгораживания» их от остального выражения
- каретка «^» обозначает начало строки
- символ доллара «$» — конец строки
- \D — нечисловые символы. Обратите внимание, верхний регистр меняет значение \d на противоположное. Это справедливо также для пар \w и \W, обозначающих латиницу и цифры и не-латиницу-и-цифры, и \s и \S, различные виды пробелов и не-пробельные символы соответственно.
Найти ячейки, начинающиеся с цифр
Выражение для подобной проверки будет:
Либо можно воспользоваться процедурой проверки на копии исходного диапазона, без необходимости вводить формулу. Смотрите примеры.
Находим ячейки, начинающиеся с цифр, с помощью регулярного выражения
Замена подстрок по регулярному выражению
Наиболее частый кейс такой замены — замена на пустоту, когда наша задача попросту удалить из текста определенные символы. Наиболее популярны:
- удаление цифр из текста
- удаление пунктуации
- всех символов, кроме букв и цифр
Но бывают случаи, когда необходима реальная замена — например, когда нужно заменить буквы с хвостиками/умляутами/ударениями и прочими символами из европейских алфавитов на их английские аналоги. Задача популярна среди SEO-специалистов, формирующих урлы сайтов этих стран на основе оригинальной семантики. Так выглядит начало таблицы паттернов для замены диакритических символов на латиницу с помощью RegEx при генерации URL:
Диакритические символы и их английские эквиваленты
Разбить ячейку по буквам
Чтобы разбить ячейку посимвольно, достаточно извлечь все символы через разделитель. Выражением для извлечения будет обычная точка, она как раз и обозначает любой символ
Разбить буквы и цифры в ячейке
Если строго соблюдать постановку этой задачи, ее выполнить довольно сложно. Но зато с помощью регулярных выражений можно отделить цифровые последовательности символов от нецифровых. Так будет выглядеть выражение:
А так будет выглядеть процесс на практике:
Разбиваем текст на цифры и нецифровые символы (буквы и знаки препинания) с помощью регулярного выражения
Вставить текст после первого слова
При замене по регулярному выражению в !SEMTools есть опция замены не всех, а только первого найденного фрагмента, удовлетворяющего паттерну. Это позволяет решить задачу вставки символов после первого слова. Просто заменим первый пробел на нужные нам символы с помощью соответствующей процедуры:
Эту задачу можно решить также с помощью функции ПОДСТАВИТЬ, но можно и воспользоваться функционалом замены по регулярному выражению. В отличие от обычной процедуры замены, здесь можно заменить только первое вхождение. В данном случае — первый пробел. Как видно, пробел ничем не отличается от обычного:
Заменяем первый пробел с помощью замены по регулярному выражению
Вставить символ после каждого слова или перед ним
Надстройка решает эту задачу в 2 клика готовой процедурой в меню «Изменить слова«, но можно воспользоваться и несложным выражением для замены:
Выражения обозначают, что заменяются пробелы или конец строки в первом случае и пробелы или начало строк во втором. Вертикальная черта — то самое «ИЛИ».
А заменять будем, соответственно, на пробел с символом слева или справа. Процедура добавит лишний пробел перед ячейкой или после, поэтому от него желательно будет избавиться — «удалить лишние пробелы» или «Удалить символы в начале / конце ячейки«.
Вставка символа после каждого слова с помощью регулярного выражения
Регулярные выражения для поиска конкретных слов в !SEMTools
Найти слова по регулярному выражению
Извлечь слова по регулярному выражению
Когда дело доходит до извлечения определенных слов, регулярные выражения становятся невероятно сложными. Поэтому надстройка !SEMTools упрощает задачу до применения паттернов RegEx на уровне слов как отдельных сущностей.
Вот так выглядит извлечение слов, содержащих латиницу и цифры, из массива слов, с помощью регулярного выражения
Обратите внимание, что выражение означает, что цифра за буквой или буква за цифрой должны следовать непосредственно, без промежуточных символов между ними. Если нужно извлечь в том числе слова вида «asdf-13», «1234-d», понадобится обозначить возможность наличия символов между:
Удалить слова по регулярному выражению
Очистить ячейки, не соответствующие регулярному выражению
Когда в вашем распоряжении массив данных, в котором могут быть ошибки, с которыми разбираться некогда, и нужно извлечь только 100% подходящие данные, можно воспользоваться регулярными выражениями для очистки нерелевантных.
Простейшая задача — взять и отделить от ячейки первый символ, скопировав его в соседний столбец. Или выбрать и оставить в ней первые 2, 3, 4… N символов.
Например, в строках переменной длины первые 6 символов — определенный цифровой код, который нужно скопировать в отдельный столбец.
Или задача является частью другой, где нужно сделать первую букву заглавной, а для этого, ее нужно вытащить из ячейки.
Рассмотрим все известные решения, снабдив их примерами. Итак, поехали.
Первые N символов — формула в Excel
Вытащить первый символ или N символов ячейки формулой проще простого. И есть даже 2 варианта:
А так будут выглядеть формулы, извлекающие первые N символов из ячейки A1. Подставьте свое число вместо N, чтобы формулы работали:
Заметное отличие первой функции от второй — в отсутствии параметра, отвечающего за позицию, с которой начинается извлечение. Поэтому, если вычислить позицию первого вхождения определенного символа в ячейке, с помощью этой функции можно извлечь его, даже если он не является первым символом строки.
- извлечь текст после цифр
- извлечь первые N цифр
- сделать первую букву ячейки заглавной
Разбить столбец по количеству символов
Можно получить первые N символов столбца, разбив его по количеству символов. Первые N останутся, а остальные будут перенесены в соседний справа. Можно разбить и на несколько — Excel не ставит ограничений на количество столбцов.
Разбиваем столбец на два, оставляя в нем первые 6 символов и переносим оставшиеся в соседний
В отличие от формул, у процедур есть свои отличия, которые можно трактовать как плюсы и минусы в зависимости от ситуации. В данном случае отличие от формул в следующих моментах:
- разбивка по столбцам не сохраняет исходный столбец
- это единоразовая процедура, в отличие от формул, которые пересчитываются при обновлении данных
- удобный момент — одна процедура создает сразу несколько столбцов
- направление разбивки — только вправо
- если справа есть данные, они могут быть перезаписаны, если не отменить операцию и не создать пустой столбец/столбцы.
Извлечь первые символы автозаполнением
Автозаполнение — замечательная процедура в Excel. Алгоритм действий прост.
- Заполняем пару ячеек соседнего столбца вручную;
- Уже при вводе третьей может быть предложено автозаполнение;
- Если согласны — жмем клавишу Ввод (Enter).
Однако с этой процедурой нужно быть осторожным. Алгоритм, который используется при автозаполнении, не показывается, поэтому результат может не соответствовать ожиданиям. Обычно алгоритм можно «доучить», чтобы он понял, что от него хотят.
Автозаполнение предлагает извлечь все цифры вначале строки, а не первые две, но алгоритм можно «доучить».
Извлечь первые символы с помощью регулярных выражений
Чтобы выбрать из строки символы по регулярным выражениям, в Google Spreadsheets доступна функция REGEXEXTRACT. Там она существует уже очень давно.
А вот Microsoft не столь серьезно озадачились вопросом — официально регулярные выражения в Excel существуют только как подключаемый модуль VBA. Поэтому доступны очень узкому кругу посвященных специалистов с навыками программирования на нем.
Чтобы сделать их необычайно гибкий синтаксис доступным обычным пользователям, я включил их поддержку в формулы и процедуры своей надстройки !SEMTools.
Подробно тут — регулярные выражения в Excel и примеры регулярных выражений. А ниже на картинке — примеры формул, которые позволят извлечь первые N символов, в том числе букв или цифр по отдельности, из любой ячейки.
Функции доступны абсолютно бесплатно и работают при подключенной надстройке !SEMTools для Excel даже в стартовой версии.
Оставить первые / последние N символов в строке в 1 клик
Ну и напоследок — на панели !SEMTools доступны процедуры, позволяющие максимально легко и быстро выбрать первые или последние символы из ячеек.
Можно выделять одну ячейку, несколько, целый столбец или даже несколько несвязанных диапазонов — процедура обработает все выделенные данные. При желании можно вернуться назад на 1 шаг.
Если активна опция «Выводить результат справа», исходные данные не меняются, а извлеченные символы выводятся в соседний столбец/столбцы.
Смотрите демонстрацию ниже:
Берем и вытаскиваем из произвольных ячеек первые / последние символы в 1 клик
Процедуры доступны в полной версии надстройки, но попробовать можно и бесплатно.
Жмите кнопку ниже, чтобы скачать и подключить надстройку к вашему Excel! Процедура займет всего пару минут.
Зачастую, при работе с многочисленными выгрузками в MS Excel нам приходится обрабатывать, фильтровать и буквально «вытаскивать» интересующие нас и так необходимые в повседневной работе данные. Степень трудоемкости таких «вытаскиваний» варьируется от «выбрать все желтые и красные строчки, потому что остальные – это не наши» до «посчитать для всех клиентов с ФИО Иванов Иван Иванович, у которых в день было больше трех операций и которые обслуживались в ВСП на территории ГОСБ, сумму их вкладных операций». В соответствии с поставленной перед нами задачей, мы выбираем инструмент для ее решения.
Если вкладка отсутствует, ее необходимо активировать следующим образом:
а) С помощью перехода в меню «Файл»-> «Параметры», отрываем окно «Параметры Excel»:
б) На вкладке «Настроить ленту» нужно выбрать «Все вкладки» и поставить отметку в строке «Разработчик», после чего нажать «ОК»:
в) Также, во вкладке «Центр управления безопасностью», необходимо перейти в «Параметры центра управления безопасностью»:
г) В открывшемся окне нужно проверить, включены ли макросы, и нажать «ОК»:
2. Перейти в «Microsoft Visual Basic for Applications», нажав кнопку «Visual Basic» во вкладке «Разработчик» или же с помощью сочетания клавиш Alt+F11
3. В открывшемся окне, необходимо последовательно перейти в меню «Инструменты» («Tools») -> «Ссылки» («References»):
4. В окне «Ссылки» («References») нужно проставить отметку в строке Microsoft VBScript Regular Expressions 5.5, после чего нажать «ОК»:
5. В окне «Microsoft Visual Basic for Applications» создать новый модуль с помощью команд «Вставка» («Insert») -> «Модуль» («Module»):
6. В открывшемся редакторе кода, необходимо написать следующую функцию:
Мы только что написали пользовательскую функцию, которая и будет обрабатывать наши текстовые конструкции, используя механизм регулярных выражений. Параметрами этой функции являются соответственно: последовательность символов, подлежащая обработке и шаблон, по которому будет производиться отбор интересующих нас подпоследовательностей символов.
Прим.: в случае повторного нахождения в строке подходящей нам подпоследовательности, она будет проигнорирована, а результатом функции будет самая первая подходящая подпоследовательность символов.
Наконец, процесс подготовки завершен, и мы можем потренироваться в написании регулярных выражений. Но, предварительно, давайте разберемся, как выглядят шаблоны для поиска. Вот самые основные из них:
Теперь можем перейти к самому интересному – написанию формул, обрабатывающих реальные примеры из жизни. Все, что нам потребуется – это написать в качестве формулы наименование нашей пользовательской функции (RegExp), где первым параметром будет просматриваемый текст, а вторым – шаблон регулярного выражения, осуществляющий поиск интересующей нас подстроки.
К примеру, рассмотрим задачу поиска в строке ИНН:*
Как видим, теперь и 10-значные, и 12-значные ИНН извлекаются корректно. Рассмотрим шаблон более подробно: \b(\d|\d)\b. В начале и в конце шаблона мы видим добавившиеся символы \b – они означают края слова и применяются для того, чтобы вместо ИНН из текста не тянулась часть более длинного ОГРН или еще какой-либо последовательности цифр. Также, мы видим, что уже знакомый нам шаблон \d переместился в скобки и получил альтернативный шаблон \d – это сделано для того, чтобы наряду с 10-значными ИНН, производился поиск и 12-значных.
В данном случае мы применяем шаблон вида [А-ЯЁ]+\s[А-ЯЁ]+\s[А-ЯЁ]+, который состоит из трех шаблонов [А-ЯЁ]+, соединенных между собой символами \s. Здесь все просто – [А-ЯЁ]+ это любой заглавный символ кириллицы с квантификатором +, то есть встречающийся от одного раза до бесконечности. Это, как раз, и будет либо фамилией, либо именем, либо отчеством клиента. Соединительные символы \s означают пробелы между членами ФИО.
Подытоживая, хочется отметить, что мы рассмотрели лишь малую часть всех возможностей, которые предоставляют регулярные выражения. Существует огромное множество спецсимволов, правил и квантификаторов, комбинируя которые возможно создавать шаблоны практически под любые подпоследовательности символов. На тему использования регулярных выражений написаны целые книги. Стоит отметить, что не все возможности классических регулярных выражений поддерживаются в VBA, но и этого хватит, чтобы облегчить нашу работу с MS Excel.
Читайте также: