我正在尝试获取Python中最高版本的字符串。我试图对列表进行排序,但是它当然不像Python对字符串表示形式进行排序那样容易。
为此,我正在尝试使用正则表达式,但是它不匹配。
字符串如下:
topic_v10_ext2
topic_v20_ext2
topic_v2_ext2
topic_v5_ext2
topic_v7_ext2
我的Regex看起来像这样。
version_no = re.search("(?:_v([0-9]+))?", v.name)
我正在考虑将名称保存在列表中,并寻找列表中最高的v_xx以返回。 同样现在,我正在两个FOR循环中执行此操作。我相信这不是最佳的2 * O(log(n))运行。 如何快速简便地获得最高版本?
答案 0 :(得分:7)
您可以将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
。
答案 1 :(得分:0)
它也可以与正则表达式一起使用,如第一次尝试:
import re
v = 'topic_v7_ext2'
version_no = re.search("^[^_]*_v([0-9]+)", v)
print(version_no.group(1))
该表达式从字符串(^)的开头搜索模式,使用与_不同的所有字符(我希望您的主题不能有一个,否则两个答案都是错误的),然后找到“ _v”并采用版本号。
无需匹配_ext,因此是否存在都没关系!