蟒蛇;通过正则表达式使用字符串中的点解析版本号

时间:2019-06-13 11:23:19

标签: python regex

所以我有string的国王:

some_string-1.4.2.4-RELEASE.some_extension

我想解析版本号(在我的示例中:1.4.2.4) 但是点之间的数字并不总是1位,它可能类似于:1.40.2.411.4.2.4

这是我尝试过的:

(\d+\.)?\d+\.\d+

这并不能解析所有数字。

编辑

我尝试使用重复链接中的答案:\d+(\.\d+)+

根据regex101,我得到以下结果:

Full match  17-24   1.4.2.4
Group 1.    22-24   .4

但是在我的代码中,我只有.4

file_name = 'some_string-1.4.2.4-RELEASE.some_extension'

match = re.findall('\d+(\.\d+)+', file_name)
if len(match) == 0:
    print('Failed to match version number')
else:
    print(match[0])
    return match[0]

3 个答案:

答案 0 :(得分:0)

您可能要考虑以下模式:

file_name = 'some_string-1.4.2.4-RELEASE.some_extension'

pattern = r'\-([0-9.-]*)\-'
match = re.findall(pattern, file_name)
if len(match) == 0:
    print('Failed to match version number')
else:
    print(match[0])

输出:

  

1.4.2.4

答案 1 :(得分:0)

您的模式几乎是正确的。

使用

(\d+(?:\.\d+)+)

这会将第一个组更改为完整的版本号,并忽略内部重复组。

str = "some_string-1.4.2.4-RELEASE.some_extension"
regex = r'''(\d+(?:\.\d+)*)'''
print(re.findall(regex, str))  # prints ['1.4.2.4']

答案 2 :(得分:0)

模式\d+(\.\d+)+包含一个重复的捕获组,并将包含上一次迭代的值.4,并将由findall返回。

如果将其设为非捕获组,则它将匹配整个值,也将匹配1.1和9.9.9.99.9.9之类的值

\d+(?:\.\d+)+

如果数字必须由3个点组成并且在连字符之间,则可以使用捕获组:

-(\d+(?:\.\d+){3})-

Regex demo

或使用环视功能而不使用组来进行匹配:

(?<=-)\d+(?:\.\d+){3}(?=-)