簡體   English   中英

正則表達式匹配符合 PEP440 的版本字符串

[英]Regex to match PEP440 compliant version strings

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

這些可以很簡單,例如: 0.0.1

或者復雜的,比如: 2016!1.0-alpha1.dev2

什么是可用於查找和驗證此類字符串的合適正則表達式?

我有同樣的問題。 這是我能找到的最徹底的正則表達式模式。 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 的正則表達式風格的。

我認為這應該符合 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*)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM