- PVSM.RU - https://www.pvsm.ru -
Челлендж от Machine Learning Lab Университета Триеста (Италия) предлагает решить [1] 12 задач причём уровень задач сильно варьируется — от супер-лёгкого до сложного.
Конечно, решений может быть больше одного и тест-кейсы в задаче покрывают не все варианты. Тем не менее если набрали 100% — то поздравляю! Тест пройден.
Спойлер: в некоторых задачах (особенно лёгких) подсказка практически и есть решение.
Имеется текст содержащий цифры, требуется найти все цифры.
Сложность: супер-лёгко.
Нужно использовать символ цифры и квантификатор множественности.
d+
"[0-9]+" тоже верное решение.
Имеется текст содержащий mac-адреса, нужно их найти.
Сложность: легко.
Нужно использовать символ означающий любой символ буквы или цифры, двоеточие для разделения и квантификатор множественности.
w{2}:w{2}:w{2}:w{2}:w{2}:w{2}
"+" вместо "{2}" тоже является верным решением, хоть и не до конца точным.
Те, кто хорошо знаком с mac-адресом заметили что mac-адрес записывается в шестнадцатеричной системе исчисления. А в предыдущем решении использовался знак w означающий любой символ алфавита и все цифры. Согласен, наверное это излишне, но можно это учесть, заодно сократив регулярку.
([da-f]{2}:){5}[da-f]{2}
Имеется текст с ftp-адресами, требуется их найти.
Сложность: легко.
Нужно начать с ftp:// а затем перечислить допустимые символы в адресе, не забыв про квантификатор множественности.
ftp://[wd-_./]+
Имеется какой то форматированный файл в котором нужно найти все строки соответствующие шаблону $любые символы$.
Сложность: легко.
Нужно использовать экранирование зарезервированного символа, символ любого символа, квантификаторы множественности и ленивый.
Банальная задача, но требует уже немного лучшего знания регулярок.
\$.+?\$
Из текста найти ip-адреса.
Сложность: легко.
Очень похоже на вторую задачу.
d+.d+.d+.d+
Если вместо "+" вы написали "{1,3}" то вы молодец.
ip-адрес это не просто цифры, а цифры от 0 до 255.
b((d|[1-9]d|1d{2}|2[0-4]d|25[0-5]).){3}(d|[1-9]d|1d{2}|2[0-4]d|25[0-5])b
Что бы определить диапазон от 0 до 255 придётся немного постараться:
Далее разрешаем повторение шаблона цифры от 0 до 255 ровно 3 раза:
Из html-документа вытащить тег href.
Сложность: средне.
Следует использовать "любой символ кроме" и "или" для каждой скобки.
href=("[^"]+"|'[^']+')
Всё это помещаем в круглые скобки, дописываем знак или — "|" и повторяем тоже самое для одинарных кавычек.
В произвольном тексте найти все ссылки. Задача усложняется тем что не достаточно просто найти ссылку, нужно выкинуть с конца не допустимые символы.
Сложность: сложно.
Нужно начинать с http, использовать "любой символ кроме" и закончить поиск символом который допустим.
http://([^>s]+)[w/]
В задаче нет ссылок https, но можно это учесть добавив "s?" после http.
И по итогу — начинаем с http://, далее совершенно любой символ кроме символов "<" или пробела, но в конце обязателен символ латинского алфавита или слэш.
В HTML заголовком считается любой тег h + цифра.
Сложность: средне.
Начните с h + цифра + любой символ или его отсутствие.
Довольно просто:
<hd.*>.*</hd.*>
После h идёт цифра, причем в спецификации html указано что допустимыми являются цифры от 1 до 6, а сам тег не может быть закрыт ничем кроме треугольных скобок. Следовательно такое решение будет более точным:
<h[1-6][^>]*>.+?</h[1-6]>
Правда тут есть ошибка позволяющая открыть тег одной цифрой, а закрыть другой. И поэтому ещё более точным решением будет использовать ссылки: "<h([1-6])[^>]*>.+?</h1>". Это не говоря о том что в тесте не учтен регистр.
Отдельно про дополнение:
В произвольном тексте найти в все телефоны в разных форматах.
Сложность: сложно.
Необходимо использовать знак наличия символа или его отсутствия, квантификатор ограничения количества цифр, конструкцию набора символов. Возможна конструкция или.
(?d{3}[). /-]{1,2}d{3}[-.]d{4}
Работать будет, но допускает два символа после первых трех цифр — хорошо если это закрывающая скобка и пробел после неё, но плохо если два дефиса. Поэтому есть чуть более точное решение: "(?d{3}() ?|[./-])d{3}[-.]d{4}"
Есть некий паттерн содержащий элементы, найти всех авторов из поля author.
Сложность: очень сложно.
Необходимо опираться на тот факт что все имена авторов начинаются с большой буквы и написаны по шаблону.
[A-Z][A-Za-z-']+, [A-Z]({\"w})?[A-za-z-']*( [A-Z][A-Za-z-']*)?
Это решение верно, но имеет минус. Мы обошли "{"u}" костылем "({"w})?" и в принципе это работоспособно если так же засунуть этот костыль в другие части имен авторов.
В любом случае если вы смогли хоть как то решить эту задачу, это очень круто!
P.S перечисление [A-Za-z] здесь вынужденная мера, потому что в тесте отсутствуют модификаторы.
Есть более компактное и простое решение позволяющее отказаться от костыля выше:
[A-Z]S+, [A-Z]S*( [A-Z][S]*)?b
Точно так же как в задаче 8, но нужно найти не сами заголовки, а их содержимое.
Сложность: сложно.
Задача идентична 8 задаче. Это не сложно если знать про заглядывание назад и вперед.
(?<=<h[^>]+>).+?(?=</hd>)
Плюс можно учесть все замечания к решению 8 задаче: "(?<=<h([1-6])[^>]*>).+?(?=</h1>)"
Задача похожа на 10 задачу, но на мой взгляд проще.
Сложность: сложно.
Все основные принципы из 10 задачи, но нужно учесть начало строки.
Имеет несколько решений, например такое:
(?<=^d+. )[A-Z][w]+, [A-Z][w.]+
Или по-проще, такое:
(?<=^d+. )[^,]+,[^,:]+
Автор: Алёхин Максим
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/regex/334255
Ссылки в тексте:
[1] решить: http://play.inginf.units.it/
[2] Источник: https://habr.com/ru/post/472110/?utm_source=habrahabr&utm_medium=rss&utm_campaign=472110
Нажмите здесь для печати.