Python 将版本号表示为正则表达式

Python 将版本号表示为正则表达式,python,regex,Python,Regex,我需要将版本号表示为正则表达式。广义的定义是 只由数字组成 允许任意数量的小数点(但不能连续) 最大数量没有限制 因此2.3.4.1,2.3,29999.9999.9999均有效,而2..2.3.则无效 我编写了以下简单的正则表达式 '(\d+\.{0,1})+' 在python和模块中使用它并在“2.6.31”中搜索 >>> y = re.match(r'(\d+\.{0,1})+$','2.6.31') >>> y.group(0) '2.6.31' &

我需要将版本号表示为正则表达式。广义的定义是

  • 只由数字组成
  • 允许任意数量的小数点(但不能连续)
  • 最大数量没有限制
  • 因此
    2.3.4.1,2.3,29999.9999.9999
    均有效,而
    2..2.3.
    则无效

    我编写了以下简单的正则表达式

    '(\d+\.{0,1})+'
    
    在python和模块中使用它并在“2.6.31”中搜索

    >>> y = re.match(r'(\d+\.{0,1})+$','2.6.31')
    >>> y.group(0)
    '2.6.31'
    >>> y.group(1)
    '31'
    
    但是如果我命名组,那么命名组只有31个


    我的正则表达式是正确的还是可以调整/改进?它目前不处理
    2.3.
    案例。

    符号
    {0,1}
    可以缩短为仅

    r'(\d+\.?)+$'
    
    但是,上面的命令将允许使用尾随的
    。或许可以尝试:

    r'\d+(\.\d+)*$'
    
    一旦验证了格式是否符合预期,最简单的方法就是使用
    re.findall()


    或者,您可能希望使用:

    或:


    捕获组将只保留模式的最后一次出现。此模式非常常见,pyparsing提供了助手函数
    delimitedList
    ,允许您将解析器编写为
    parser=delimitedList(integer,delim=')
    得到同样的结果。@PaulMcGuire我已经更新了我的答案。非常感谢你的评论,也感谢你的分析。
    >>> ver = "1.2.3.4"
    >>> re.findall(r'\d+', ver)
    ['1', '2', '3', '4']
    
    >>> from pyparsing import *
    >>> integer = Word(nums)
    >>> parser = delimitedList(integer, delim='.') + StringEnd()
    >>> list(parser.parseString('1.2.3.4'))
    ['1', '2', '3', '4']
    
    >>> from lepl import *
    >>> with Separator(~Literal('.')):
    ...    parser = Integer()[1:]
    >>> parser.parse('1.2.3.4')
    ['1', '2', '3', '4']