Регулярное выражение для разделения строки загрузки ЦП без процента

#regex #grafana #telegraf

Вопрос:

Можно ли получить результат только с первыми двумя цифрами без % в первой группе. Я использую Телеграф с Графаной.

Пример:

 5 Secs ( 22.3463%) 60 Secs ( 25.677%) 300 Secs ( 21.3522%)
 

Результат:

 22
 

Я нашел это регулярное выражение в аналогичной теме, но для меня это плохой формат :

 ^s*d s Secss*(s*(d (?:.d )?%))s d s Secss (s (d (?:.d )?%))s d s Secss (s (d (?:.d )?%))$
 

Комментарии:

1. Какой вариант регулярных выражений вы используете (python, javascript, какое-то конкретное программное обеспечение)? Группировка работает значительно по-разному в каждом конкретном случае, так же как и другие функции, такие как обратные ссылки и ссылки

Ответ №1:

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

Вы можете опустить вторую и третью группы захвата, так как они вам не нужны.

 ^s*d s Secss*(s*(d )(?:.d )?%)s d s Secss (s d (?:.d )?%)s d s Secss (s d (?:.d )?%)$

                      ^   ^
 

Демонстрация регулярных выражений

Или вы можете использовать именованную группу захвата, например digits

 ^s*d s Secss*(s*(?P<digits>d )(?:.d )?%)s d s Secss (s d (?:.d )?%)s d s Secss (s d (?:.d )?%)$
 

Ответ №2:

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

 ^d s Secss (s (d )(?:.d %)?)(?:s d s Secss (s d (?:.d )?%))*
 

Онлайн-демонстрация для приведенного выше регулярного выражения

Пояснение: Добавление подробного объяснения вышеизложенного.

 ^d s Secss (s           ##From starting of value matching digits(1 or more occurrences) followed by space(s) Secs spaces ( spaces.
(d )                        ##Creating 1st and only capturing group where we have digits in it.
(?:.d %)?)                ##In a non-capturing group matching dot digits % ) keeping it optional followed by )
(?:                          ##Creating a non-capturing group here.
   s d s Secss (s d   ##matching spaces digits spaces Secs spaces ( spaces digits
   (?:.d )?                ##In a non-capturing group matching dot digits keeping it optional.
   %)                       ##matching % followed by ) here.
)*                           ##Closing very first non-capturing group, and matching its 0 or more occurrences.
 

Ответ №3:

Если бы вы искали только 1-е событие, разве не сработало бы следующее?

 /secss*(s*(d )/i