用正则表达式表示版本号

4 投票
2 回答
3978 浏览
提问于 2025-04-17 09:59

我需要用正则表达式来表示版本号。大致的定义是:

  1. 只能由数字组成
  2. 可以有任意数量的小数点(但不能连续出现)
  3. 对最大数字没有限制

所以像 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 个回答

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']
6

这个表示法 {0,1} 可以简化成 ?:

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

不过,上面的写法会允许最后有一个 .。你可以试试这个:

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

一旦你确认格式符合你的预期,提取数字最简单的方法就是用 re.findall():

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

撰写回答