我试图在Python中获得最高版本的字符串版本。我试图对列表进行排序,但是当然,这没有像Python那样轻松地对字符串表示。
为此,我正在尝试与Regex一起工作,但它不匹配。
字符串看起来像这样:
topic_v10_ext2
topic_v20_ext2
topic_v2_ext2
topic_v5_ext2
topic_v7_ext2
我的正则是这样。
version_no = re.search("(?:_v([0-9]+))?", v.name)
我正在考虑将名称保存在列表中,并在列表中查找返回的最高v_xx。同样,现在我将其分为两个循环。我相信,它以2*o(log(n))运行,这不是最佳的。如何以快速而简单的方式获得最高版本?
您可以使用sorted
或list.sort
使用key
:
sorted(l, key=lambda x:int(x.split('_')[1][1:]), reverse=True)
['topic_v20_ext2',
'topic_v10_ext2',
'topic_v7_ext2',
'topic_v5_ext2',
'topic_v2_ext2']
-
x.split('_')
:返回分裂的str
,例如:['topic', 'v20', 'ext2']
- 由于版本是排序的关键,请通过
x.split('_')[1]
选择它 - 选定的
V20
具有不需要的字符'V',因此通过切片[1:]
来重新选择它以获取所有数字。 - 最后,将数字转换为
int
进行数值订购。
另外,默认情况下, sorted
返回排序的上升顺序。由于您需要降序,请使用reverse=True
。
它也可以与正则表达式一起使用,就像第一次尝试时:
import re
v = 'topic_v7_ext2'
version_no = re.search("^[^_]*_v([0-9]+)", v)
print(version_no.group(1))
该表达式从字符串(^)的开头搜索模式,将所有字符与_不同(我希望您的主题都不有一个,否则两个答案都是错误的),然后找到'_V'并采用版本号。
无需匹配_ext,所以它是否在那里都没关系!