正则表达式以匹配PEP440兼容的版本字符串

2024-04-27 14:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

PEP 440列出Python包的版本字符串的可接受格式。在

这些可以很简单,比如:0.0.1

或者很复杂,比如:2016!1.0-alpha1.dev2

什么是可用于查找和验证此类字符串的合适正则表达式?在


Tags: 字符串版本格式dev2pepalpha1
2条回答

我也有同样的问题。这是我能找到的最彻底的正则表达式模式。PEP440在其参考部分中链接到打包库的代码库。在

pip install packaging

要只访问模式字符串,可以使用全局

^{pr2}$

参见:https://github.com/pypa/packaging/blob/16.7/packaging/version.py#L159

# Deliberately not anchored to the start and end of the string, to make it
# easier for 3rd party code to reuse
VERSION_PATTERN = r"""
v?
(?:
    (?:(?P<epoch>[0-9]+)!)?                           # epoch
    (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
    (?P<pre>                                          # pre-release
        [-_\.]?
        (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
        [-_\.]?
        (?P<pre_n>[0-9]+)?
    )?
    (?P<post>                                         # post release
        (?:-(?P<post_n1>[0-9]+))
        |
        (?:
            [-_\.]?
            (?P<post_l>post|rev|r)
            [-_\.]?
            (?P<post_n2>[0-9]+)?
        )
    )?
    (?P<dev>                                          # dev release
        [-_\.]?
        (?P<dev_l>dev)
        [-_\.]?
        (?P<dev_n>[0-9]+)?
    )?
)
(?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
"""

当然,这个例子是特定于Python的regex风格的。在

我认为这应该符合PEP440:

^(\d+!)?(\d+)(\.\d+)+([\.\-\_])?((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?(\.?(post|dev)\d*)?$

解释

Epoch,例如2016!

^{pr2}$

版本部件(主要、次要、修补程序等):

(\d+)(\.\d+)+

可接受的分隔符(.-或{}):

([\.\-\_])?

可能的预发布标志(及其规范化;以及发布后标志rrev)后面可能有一个或多个数字:

((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?

发布后标志和一个或多个数字:

(\.?(post|dev)\d*)?

相关问题 更多 >