- Написать функции, где будет внутри регулярное выражение
- На эти функции сделать покрытие юнит тестами
Код оформить по PEP8
Eсть три строки вида:
--path.settings C:\Users\Administrator\ELK\logstash-8.11.1\config --another.key qweqweqwe
--path.settings "C:\Program Files\Elastic" --another.key qweqweqwe
--path.settings C:\Program Files\Elastic --another.key qweqweqwe
Регулярака должна находить путь целиком
Результат для каждого варианта
C:\Users\Administrator\ELK\logstash-8.11.1\config
C:\Program Files\Elastic
C:\Program Files\Elastic
Написать регулярку, чтобы из предоставленного конфига получить все bind - IP адреса
listen tcp_public
mode tcp
bind 10.0.210.252:9000,10.0.210.253:9000
bind ipv4@172.30.148.13:443 ssl crt /etc/haproxy/site.pem
bind ipv6@:80
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
bind 2a00:f920:192::233:80
server tcpsrv0 192.168.1.101:9999
use_backend dghj
Результат:
10.0.210.252:9000,10.0.210.253:9000
ipv4@172.30.148.13:443
ipv6@:80
2a00:f920:192::233:80
Из полученных результатов "задания 2" создать коллекцию вида:
(
{IP: 10.0.210.252, Type: ipv4, Port: 9000},
)
Где ip указан не явно нужно сделать подстановку:
- для ip4 - значение по умолчанию
0.0.0.0 - для ip6 - значение по умолчанию
::
--path\.settings\s+\"?(([A-Za-z]:\\[^"\s]+(?:\s+[^"\s-]*)*)|(/[^"\s]+(?:\s+[^"\s-]*)*))\"?(?=\s|$|--|\s+[^-])
-
--path\.settings:--path.settings— это фиксированная часть строки, которая начинается с--pathи заканчивается.settings.\.settings— точка передsettingsэкранирована, чтобы указать, что это именно точка, а не специальный символ.
-
\s+:\s+— соответствует одному или более пробельным символам (например, пробелы, табуляция, новые строки).
-
\"?:\"?— соответствует нулю или одному символу двойной кавычки ("). Это значит, что кавычка может быть, а может и не быть.
-
((начало группы):- Открывающая скобка
(начинает захватывающую группу, что позволяет нам позже обращаться к содержимому этой группы.
- Открывающая скобка
-
(([A-Za-z]:\\[^"\s]+(?:\s+[^"\s-]*)*)|(/[^"\s]+(?:\s+[^"\s-]*)*)):- Это большая группа, в которой есть две альтернативы:
[A-Za-z]:\\[^"\s]+(?:\s+[^"\s-]*)*:[A-Za-z]:\\— соответствует пути на Windows, который начинается с буквы диска (например,C:) и заканчивается обратной косой чертой (\).[^"\s]+— соответствует одному или более символам, которые не являются кавычкой или пробелом.(?:\s+[^"\s-]*)*— соответствует нулю или более повторениям пробелов, за которыми следуют символы, не являющиеся кавычками или пробелами (это делает путь более гибким, позволяя пробелы в пути).
|— это оператор "или", разделяющий две альтернативы.(/[^"\s]+(?:\s+[^"\s-]*)*):/— соответствует символу косой черты, который обычно используется в путях Unix/Linux.[^"\s]+— соответствует одному или более символам, которые не являются кавычкой или пробелом.(?:\s+[^"\s-]*)*— аналогично предыдущему, позволяет пробелы в пути.
- Это большая группа, в которой есть две альтернативы:
-
\"?(закрывающая часть):- Закрывающая кавычка снова может присутствовать или отсутствовать, как и ранее.
-
(?=\s|$|--|\s+[^-]):- Это позитивный просмотр вперед. Он проверяет, что после найденного пути есть один из следующих символов:
\s— пробел.$— конец строки.--— другой параметр командной строки.\s+[^-]— пробелы, за которыми следует любой символ, кроме дефиса. Это позволяет избежать захвата некорректных аргументов.
- Это позитивный просмотр вперед. Он проверяет, что после найденного пути есть один из следующих символов:
Регулярное выражение позволяет захватывать и валидировать пути к файлам в различных форматах (как Windows, так и Unix/Linux) после параметра командной строки --path.settings, с возможностью обработки пробелов и кавычек.
Так как, исходя из примера, у нас всегда указан порт у адреса, мы можем искать регуляркой подстроки, стоящие после bind (bind и пробел) и продолжающиеся до следующего (пробела) или конца строки и содержащие : (двоеточие).
bind\s+([^:\s]*[^:\s]*:\S*)
-
bind:- Это фиксированная строка, к которой должно соответствовать начало искомого выражения. Она ищет слово "bind".
-
\s+:\s+соответствует одному или более пробельным символам (таким как пробелы, табуляция и т.д.). Это указывает, что после словаbindдолжно быть хотя бы одно пробельное место, прежде чем начнется следующий элемент.
-
((открытие группы захвата):- Открывающая скобка
(начинает захватывающую группу. Всё, что внутри этой группы, будет сохранено для дальнейшего использования или проверки. Это полезно, если нам нужно извлечь часть строки, соответствующую этому выражению.
- Открывающая скобка
-
[^:\s]*:[^:\s]*соответствует нулю или более символам, которые не являются двоеточием (:) или пробелом (\s). Это значит, что он захватит любую строку, не содержащую пробелов и двоеточий.- Если строка не содержит пробелов и двоеточий, она захватывается целиком.
-
[^:\s]*(еще раз):- Повторение
[^:\s]*— это еще один набор символов, не содержащих пробелов и двоеточий. - Зачем оно здесь повторяется? Это позволяет разделить захват между первым блоком символов (без пробелов и двоеточий) и вторым, который тоже не содержит их, но может находиться перед
:, что позволяет получить необходимую часть строки, если она разделена двоеточием.
- Повторение
-
::- Это конкретный символ двоеточия, который должен появиться после предыдущих символов.
-
\S*:\S*соответствует нулю или более непробельных символов. Здесь мы ожидаем, что после двоеточия будут идти любые символы, кроме пробелов, например, порты, идентификаторы, и т.д.
-
)(закрытие группы захвата):- Закрывающая скобка завершает группу захвата.
Все 3 функции покрыты unit тестами.
В директории tests/test_cases содержатся тест кейсы для каждой функции