Я пытаюсь написать библиотеку Python для анализа строк формата нашей версии. (Упрощенный) формат строки версии выглядит следующим образом:
<product>-<x>.<y>.<z>[-alpha|beta|rc[.<n>]][.<extra>]][.centos|redhat|win][.snb|ivb]
Это:
- продукт, т.е.
foo
- числовая версия, например:
0.1.0
- [необязательно] предварительная информация, например:
beta
,rc.1
,alpha.extrainfo
- [необязательно] операционная система, например:
centos
- [необязательно] платформа, например:
snb
,ivb
Таким образом, следующие строки являются допустимыми версиями:
1) foo-1.2.3
2) foo-2.3.4-alpha
3) foo-3.4.5-rc.2
4) foo-4.5.6-rc.2.extra
5) withos-5.6.7.centos
6) osandextra-7.8.9-rc.extra.redhat
7) all-4.4.4-rc.1.extra.centos.ivb
Для всех этих примеров отлично работает следующее регулярное выражение:
^(?P<prod>\w+)-(?P<maj>\d).(?P<min>\d).(?P<bug>\d)(?:-(?P<pre>alpha|beta|rc)(?:\.(?P<pre_n>\d))?(?:\.(?P<pre_x>\w+))?)?(?:\.(?P<os>centos|redhat|win))?(?:\.(?P<plat>snb|ivb))?$
Но проблема возникает в версиях этого типа (без «дополнительной» предварительной информации, но с ОС и/или платформой):
8) issue-0.1.0-beta.redhat.snb
С приведенным выше регулярным выражением для строки № 8 redhat
выбирается в предварительной информации pre_x
вместо группы os
.
Я попытался использовать look-behind, чтобы избежать выбора строк ОС или платформы в pre_x
:
...(?:\.(?P<pre_x>\w+))?(?<!centos|redhat|win|ivb|snb))...
То есть:
^(?P<prod>\w+)-(?P<maj>\d).(?P<min>\d).(?P<bug>\d)(?:-(?P<pre>alpha|beta|rc)(?:\.(?P<pre_n>\d))?(?:\.(?P<pre_x>\w+))?(?<!centos|redhat|win|ivb|snb))?(?:\.(?P<os>centos|redhat|win))?(?:\.(?P<plat>snb|ivb))?$
Это могло бы работать нормально, если бы стандартный модуль Python re
мог принимать переменную ширину просмотра. Я предпочел бы придерживаться стандартного модуля, а не использовать regex, так как моя библиотека довольно вероятно, будет распространяться на большое количество машин, где я хочу ограничить зависимости.
Я также рассмотрел похожие вопросы: это , это и это не применимо.
Любые идеи о том, как этого добиться?
Моя ссылка на regex101: https://regex101.com/r/bH0qI7/3
[Для тех, кто заинтересован, это полное регулярное выражение, которое я фактически использую: https://regex101.com/r/lX7nI6/2]
re
. TBH, я потерял преобразование этого в предвидение. - person Xabs   schedule 27.05.2015