gpt4 book ai didi

用于解析版本字符串并查看固定宽度的Python正则表达式

转载 作者:行者123 更新时间:2023-11-30 23:10:55 24 4
gpt4 key购买 nike

我正在尝试编写一个 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组。

我尝试使用后视来避免选择 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因为我的库很可能分发到大量机器,我想限制依赖关系。

我也看过类似的问题:this , thisthis不适用。

关于如何实现这一目标有什么想法吗?

我的 regex101 链接:https://regex101.com/r/bH0qI7/3

[对于那些感兴趣的人,这是我实际使用的完整正则表达式:https://regex101.com/r/lX7nI6/2]

最佳答案

您需要使用否定先行断言来生成 (?P<pre_x>\w+)匹配除 centos 之外的任何内容或redhat .

^(?P<prod>\w+)-(?P<maj>\d)\.(?P<min>\d)\.(?P<bug>\d)(?:-(?P<pre>alpha|beta|rc)(?:\.(?P<pre_n>\d))?(?:\.(?:(?!centos|redhat)\w)+)?)?(?:\.(?P<os>centos|redhat))?(?:\.(?P<plat>snb|ivb))?$

DEMO

关于用于解析版本字符串并查看固定宽度的Python正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com