匹配 PEP440 兼容版本字符串的正则表达式
Regex to match PEP440 compliant version strings
PEP 440 列出了 Python 包版本字符串的可接受格式。
这些可以很简单,例如:0.0.1
或复杂,如:2016!1.0-alpha1.dev2
可用于查找和验证此类字符串的合适正则表达式是什么?
我认为这应该符合 PEP440:
^(\d+!)?(\d+)(\.\d+)+([\.\-\_])?((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?(\.?(post|dev)\d*)?$
已解释
纪元,例如2016!
:
(\d+!)?
版本部分(主要、次要、补丁等):
(\d+)(\.\d+)+
可接受的分隔符(.
、-
或 _
):
([\.\-\_])?
可能的预发布标志(及其规范化;以及 post 发布标志 r
或 rev
),可能有一个或多个数字跟随:
((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?
Post-release flags,一位或多位:
(\.?(post|dev)\d*)?
我也有同样的问题。这是我能找到的最彻底的正则表达式模式。 PEP440 在其参考部分链接到打包库的代码库。
pip install packaging
要仅访问模式字符串,您可以使用全局
from packaging import version
version.VERSION_PATTERN
参见:https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L225-L254
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 的正则表达式风格。
PEP 440 列出了 Python 包版本字符串的可接受格式。
这些可以很简单,例如:0.0.1
或复杂,如:2016!1.0-alpha1.dev2
可用于查找和验证此类字符串的合适正则表达式是什么?
我认为这应该符合 PEP440:
^(\d+!)?(\d+)(\.\d+)+([\.\-\_])?((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?(\.?(post|dev)\d*)?$
已解释
纪元,例如2016!
:
(\d+!)?
版本部分(主要、次要、补丁等):
(\d+)(\.\d+)+
可接受的分隔符(.
、-
或 _
):
([\.\-\_])?
可能的预发布标志(及其规范化;以及 post 发布标志 r
或 rev
),可能有一个或多个数字跟随:
((a(lpha)?|b(eta)?|c|r(c|ev)?|pre(view)?)\d*)?
Post-release flags,一位或多位:
(\.?(post|dev)\d*)?
我也有同样的问题。这是我能找到的最彻底的正则表达式模式。 PEP440 在其参考部分链接到打包库的代码库。
pip install packaging
要仅访问模式字符串,您可以使用全局
from packaging import version
version.VERSION_PATTERN
参见:https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L225-L254
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 的正则表达式风格。