正则表达式匹配符合 PEP440 的版本字符串

Posted

技术标签:

【中文标题】正则表达式匹配符合 PEP440 的版本字符串【英文标题】:Regex to match PEP440 compliant version strings 【发布时间】:2016-10-24 15:09:16 【问题描述】:

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

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

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

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

【问题讨论】:

你的正则表达式在哪里,它有什么问题? 【参考方案1】:

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

pip install packaging

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

from packaging import version
version.VERSION_PATTERN

见: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 的正则表达式。

【讨论】:

谢谢,这是我需要的答案。 您已将您的 cmets 包含在常规字符串中,所以我不希望它按原样工作 虽然这可能很全面,但我不能将它用作 Travis 中的分支匹配模式。【参考方案2】:

我认为这应该符合PEP440:

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

解释

时代,例如2016!:

(\d+!)?

版本部分(主要、次要、补丁等):

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

可接受的分隔符(.-_):

([\.\-\_])?

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

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

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

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

【讨论】:

这是一个很难解决的问题,对使用 Python 打包的人来说非常有用。这不是一个体面的问题吗? 更重要的是,如果有人有更好的解决方案,我真的很想知道。 第一件事..问整个问题..您的正则表达式比您在问题中指出的信息多得多..

以上是关于正则表达式匹配符合 PEP440 的版本字符串的主要内容,如果未能解决你的问题,请参考以下文章

JAVA正则表达式怎么匹配所有符合要求的子字符串

正则表达式如何匹配空值?

正则表达式如何匹配空值?

如果字符串完全符合定义,则匹配正则表达式

Linux的正则表达式

tcl 正则匹配与替换