バージョン形式の文字列を解析する 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))?$
しかし、このタイプのバージョンで問題が発生します (「追加の」プレリリース情報はありませんが、OS やプラットフォームに問題があります):
8) issue-0.1.0-beta.redhat.snb
上記の正規表現では、文字列 #8が、グループではなくredhat
プレリリースの extra info で取得されています。pre_x
os
でosまたはプラットフォーム文字列を選択しないように、後読みを使用してみました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))?$
re
これは、Python の標準モジュールが可変幅の後読みを受け入れることができる場合にうまく機能します。私のライブラリは、依存関係を制限したい多数のマシンに配布される可能性が非常に高いため、正規表現を使用するのではなく、標準モジュールに固執することをお勧めします。
同様の質問も見てきました: this、this、およびthisは適用できません。
これを達成する方法についてのアイデアはありますか?
私の正規表現リンク: https://regex101.com/r/bH0qI7/3
[興味のある方のために、これは私が実際に使用している完全な正規表現です: https://regex101.com/r/lX7nI6/2]