101regexp или регулярные выражения

Я помню, как в свое время аббревиатура regexp (англ. regular expressions), вызывала у меня страх и ужас. Если была необходимость где-то использовать их. Нет, серьезно, тогда мне это казалось как выучить китайский язык. Сейчас я могу спокойно писать сложные и простые регулярные выражения для многих языков и текстовых процессоров вроде grep или sed. Кстати говоря, утилита grep разрабатывалась именно для её использования с регулярными выражениями и само название — это аббревиатура из всех слов (search globally for lines matching the regular expression, and print them), но большинство системных администраторов или DevOp’s инженеров не пользуются ею именно в том виде, для которого она создавалась. Но об этом чуть позже. И так. Регулярные выражения. Простыми словами список сопоставлений (шаблонов), одного или нескольких, объединённым в группы и нет, для которых будет найден необходимый фрагмент текста. Ниже я приведу полную таблицу всех операторов регулярных выражений, но сейчас, что бы познакомится хватит нескольких.

Для начала, небольшая шпаргалка:

Оператор:Описание:
.Любой символ кроме новой строки.
\w \d \sЛюбое слово, любая цифра, любой символ включая пробел.
\W \D \SЛюбое не слово, любая не цифра и не пробел.
[abc]Любое сочетание a, b, или c.
[^abc]Все кроме a, b, или c.
[a-g]Любая буква в диапазоне от a до g.
\. \* \\Экранировать специальные символы.
(abc)Создание группы.
(?:abc)Исключить группу.
(?=abc)Включить в резлультат.
(?!abc)Исключить из результата.
a* b+ c?Любой символ и более, только первый и далее, любой и следующий за ним.
ab|bcИли.

На первый взгляд кажется ужасным, но практика поможет понять, что это не так страшно, как кажется. Возьмем пример и попробуем разбить его с помощью регулярных выражений. Что бы заставить grep использовать их, достаточно добавить несколько ключей: -P использовать регулярные выражения, -o выводить только результат, то есть, не всю строку в которой встретиться результат, а именно только результат. Выберем только цифры из приведенного примера:

#  echo "Hello world! Count down in: 5,4,3,2,1!" | grep -Po '\d+'
Вывод:
5
4
3
2
1

Отлично, мы выбрали только цифры, так как следует из шпаргалки оператор \d выводит любую цифру, а знак + говорит что бы в последовательность вошли все цифры которые встрется после первого совпадения. Теперь попробуем исключить цифры из текста:

# echo "Hello world! Count down in: 5,4,3,2,1!" | grep -Po '([^\d]+)'
Вывод:
Hello world! Count down in: 
,
,
,
,
!


И так, выражение стало сложнее, но давайте разберем его. Скобки (), означают что мы создал группу, как видно из шпаргалки ([^abc]), мы взяли все что не является цифрой получили [^\d]+, знак + означает что за первым совпадением нужно забрать все… кроме цифр. Вот и все. Так просто.

А теперь уберем все лишние знаки что остались после удаления цифр:


# echo "Hello world! Count down in: 5,4,3,2,1!" | grep -Po '([^\d]+)([^\w])'
Вывод:
Hello world! Count down in:


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

# echo "Hi, I am Vasily Yakunin and I am 40 years old" | grep -Po '(?<name>Vasily\s\w+)|(?<age>\d+)'

Вывод:
Vasily Yakunin
40

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

Но скажем как на счет примера посложнее? Конечно, почему нет, я люблю python и часто использую его в своей работе, давайте попробуем написать что-то, например, я хочу знать какая последняя версия необходимого мне продукта. А именно RoundCube (пользовательский web-интерфейс для почтовых серверов), есть адрес проекта в Git https://github.com/roundcube/roundcubemail/releases/latest/ хорошо, мы хотим получать последнюю версию.

Пишем не сложный код:

#!/usr/bin/python3.8
import requests
import re

regex = r'\/(?P<version>\d+\S+)"'
r = requests.get('https://github.com/roundcube/roundcubemail/releases/latest', allow_redirects=False)
print (re.findall(regex, r.text)[0])
Вывод: 1.4.11

В завершении, есть множество удобных online конструкторов для регулярных выражений, я рекомендую https://regex101.com/ попробуйте и удачных выражений 😉