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

时间:2012-01-11 08:32:18

标签: python regex

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

  1. 仅包含数字
  2. 允许任意数量的小数点(但不是连续的)
  3. 最大数量无限制
  4. 所以2.3.4.1,2.3,2,9999.9999.9999都有效,而2..,2.3.则不是。

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

    '(\d+\.{0,1})+'
    

    在python中使用re模块并在'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.案例。

2 个答案:

答案 0 :(得分:6)

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

r'(\d+\.?)+$'

但是,上述内容将允许尾随.。也许试试:

r'\d+(\.\d+)*$'

验证格式符合您的预期后,获取数字的最简单方法是re.findall()

>>> ver = "1.2.3.4"
>>> re.findall(r'\d+', ver)
['1', '2', '3', '4']

答案 1 :(得分:2)

或者,您可能希望使用pyparsing

>>> from pyparsing import *
>>> integer = Word(nums)
>>> parser = delimitedList(integer, delim='.') + StringEnd()
>>> list(parser.parseString('1.2.3.4'))
['1', '2', '3', '4']

lepl

>>> from lepl import *
>>> with Separator(~Literal('.')):
...    parser = Integer()[1:]
>>> parser.parse('1.2.3.4')
['1', '2', '3', '4']