www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Введение в регулярные выражения

Дата публикации Oct 3, 2019

Когда я заканчиваю свою третью неделю на интенсивном курсе разработки программного обеспечения в школе Flatiron, один (как оказалось, довольно полезно) Кривая, которая мне запомнилась, была проблемой кодирования, данной нам на нашей первой неделе.

Нас попросили написать метод Ruby, который мог бы вызываться для строки и который возвращал бы количество предложений, содержащихся в этой строке.

Хорошо. Достаточно просто, верно?

Первое решение, которое приходит на ум, может выглядеть примерно так:

Но не так быстро! А как насчет предложений, которые заканчиваются восклицательными или вопросительными знаками? Что насчет ... эллипсов? Что если мы удвоим нашу конечную пунктуацию ?!

Метод, который правильно подсчитывает количество предложений в абзаце выше со всеми его крайними случаями, определяется ниже:

Этот материал передается#splitметод называетсяРегулярное выражение,но для меня, в мой третий день программирования, могло бы быть так:

self.split(/ [¯\_(ツ)_/¯] /)

Синтаксис выглядел странно; как то бояться Однако, покопавшись немного глубже, я понял, насколько мощными могут быть регулярные выражения, помогающие избежать написания довольно липкой логики всякий раз, когда вам нужно сопоставить шаблоны в вашем коде.

Ниже приведено краткое и простое введение в регулярные выражения и несколько простых для понимания примеров.

Использование регулярных выражений

Регулярные выраженияявляются шаблонами, которые описывают содержимое строки и используются для проверки того, содержит ли строка этот шаблон.

Существует два способа создания регулярного выражения:

  1. Литералы с шаблоном, который вы пытаетесь сопоставить, помещенным между двумя косыми чертами (​/.../) Или в процентной строке Ruby%r{...},
  2. Вы также можете использовать конструктор объекта регулярного выражения с шаблоном, который вы ищете, переданным конструктору в скобках и кавычках:​Regexp.new(‘...'),

Есть два способа сопоставить шаблон регулярного выражения с заданной строкой. Каждый из них демонстрируется во фрагментах ниже:

  1. ​#matchМетод, который принимает аргумент​stringИ возвращает либо​MatchDataОбъект, описывающий совпадение или​nil,
  2. Оператор сопоставления с образцом,=~, Который возвращает индекс строки при совпадении начинается или​nil,

В поисках паттернов

Самая простая реализация регулярных выражений - это поиск в строке целых слов или частей слов.

метасимволов

При написании ваших собственных шаблонов регулярных выражений, вы хотите быть осторожнымиметасимволы, которые используются при построении регулярных выражений и имеют особое значение.

Вы хотитепобегэтиметасимволыс обратной косой чертой,\:

​(​)​[​]​{​}​.​?​+И​*

В приведенном ниже примере первое выражение возвращает «ноль», потому что метасимволы​+И​?Не избежали обратной косой черты:

Классы персонажей

Классы символов выделяются в квадратных скобках​[ ]И содержат список символов, любой из которых может появиться в указанной точке совпадения:

Изменяется

Хотя классы символов предоставляют нам большую гибкость в определении того, что должно возвращать совпадение, вы можете представить, как они могут стать длинными и громоздкими быстро.

Дефис,​-Позволяет нам обозначать включающий диапазон, избавляя нас от необходимости набирать весь набор символов, с которыми вы хотите проверить.

Скажем, мы хотим посмотреть на первый символ слова и вернуть совпадение только в том случае, если эта буква встречается в первой половине алфавита.

Здесь мы можем использовать диапазоны вместо того, чтобы печатать класс символов, содержащий все буквы в алфавите, которые мы хотели бы вернуть:

​[a-m]Эквивалентно классу персонажа[abcdefghijklm]​,

​[n-z]Эквивалентно классу персонажа​[nopqrstuvwxyz],

Отрицание

Таким же образом мы можем использовать диапазоны для указания символов, которые мыделатьЕсли вы хотите соответствовать, мы также можем указать символы, которые мы хотели бы исключить из совпадений, сделав первый символ класса символов каратом​^,

Сокращение для диапазонов

Есть также несколько удобных сокращений для указания диапазонов.

Обратите внимание, что строчные и прописные версии этих сокращений являются инверсиями друг друга.

Ниже приведены несколько примеров:

​\dБудет соответствовать всему, что является цифрой и эквивалентно​[0-9],

​\DБудет соответствовать всему, чтонецифра и эквивалентно​[^0-9],

\wБудет соответствовать любому буквенно-цифровому символу и эквивалентно[a-zA-Z0-9],

\WБудет соответствовать любому символу и эквивалентно[a-zA-Z0-9],

Кванторы

И если повторение стенографииметасимволыв двух приведенных выше примерах выделяется «запах кода», вы можете использовать квантификаторы, чтобы указать, сколько раз должно совпадать.

​{n}Соответствует, когда предыдущий символ или диапазон встречаются точноNраз

Итак, для рефакторинга приведенного выше примера:

{n,m}Соответствует, когда предыдущий символ или диапазон встречаются хотя быNраз и самое большеемраз:

Вывод

Хотя это короткое введение в регулярные выражения только царапает поверхность, надеюсь, оно помогло немного демистифицировать их и вдохновит вас самим углубиться в них.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map