所以我有string
的国王:
some_string-1.4.2.4-RELEASE.some_extension
我想解析版本号(在我的示例中:1.4.2.4
)
但是点之间的数字并不总是1位,它可能类似于:1.40.2.4
或11.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]
答案 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})-
或使用环视功能而不使用组来进行匹配:
(?<=-)\d+(?:\.\d+){3}(?=-)