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

Рейтинг: 1Ответов: 1Опубликовано: 19.04.2023

Есть набор строк следующего вида:

'8.0 (Debian GNU/Linux), 9.0 (Debian GNU/Linux), 1.16.0 (c-ares)',
'8.0 (Debian GNU/Linux), 9.0 (Debian GNU/Linux), до 1.16.0 включительно (c-ares)',
'8.0 (Debian GNU/Linux), 1.16.0 (c-ares), 9.0 (Debian GNU/Linux)'
'8.0 (Debian GNU/Linux), от 1.15.1 до 1.16.0 (c-ares), 9.0 (Debian GNU/Linux), 10.0 (Debian GNU/Linux)',
'до 1.11.0 (c-ares), 8.0 (Debian GNU/Linux), 9.0 (Debian GNU/Linux)'
'1.11.0 (c-ares), 8.0 (Debian GNU/Linux), 9.0 (Debian GNU/Linux)'

Необходимо регулярным выражением вытащить версию библиотеки (в данном примере c-ares). Если версии две (как в строке 4: от 1.15.1 до 1.16.0), необходимо получить их обе. Если одна, то получить только одну.

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

regex = fr'(?i)([\S.]+)?\D*?([\S.]+)?\D+?\({lib_name}\)'

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

PS. Версии могут быть в любом виде: 1.2.3, 4.5, 6 или даже xyz и 31462c97

Ответы

▲ 0Принят

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

[а-яА-я ]*([^а-яА-я, ]*)[а-яА-я ]*([^а-яА-я, ]*)[а-яА-я ]*\(c-ares\)

regex101