在Python中获取最高的字符串版本号

5
我尝试在Python中获取字符串的最高版本。我试图对列表进行排序,但很明显这样做不容易,因为Python将按照字符串表示进行排序。
为此,我正在尝试使用正则表达式,但它似乎无法匹配。
这些字符串看起来像这样:
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以返回。目前,我正在使用两个FOR循环执行此操作。这需要 2*O(log(n)) 的时间复杂度,效率不高。有什么简单快速的方式可以获取最高版本号吗?

2
请展示输入字符串的确切数据格式。它们是在文件、列表还是其他数据结构中?ext后面的值是否属于版本号? - Rory Daulton
什么是“字符串表示法”?为什么topic_v...不能是字符串? - PrinceOfCreation
1
你的正则表达式会匹配任何地方,因为你在结尾处使用了?,使整个表达式变成可选项。 - glibdud
@RoryDaulton 不是的,只有 _vXX 是版本的一部分。但扩展名是可选的,不总是存在。 - Derek Haynes
@PrinceOfCreation 它们是不同的对象,具有可以在for循环中读取的字符串键名 .name。 - Derek Haynes
2个回答

8
您可以使用sortedlist.sortkey一起使用:
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


有时间的话,能否稍微解释一下 x:int(x.split('_')[1][1:]) 部分的含义? - Derek Haynes
@DerekHaynes 我已经编辑了答案,请让我知道如果有任何部分不清楚。 - Chris
是啊,伙计!今天最棒的人!这真的为我和许多人解释得非常清楚。非常感谢。 - Derek Haynes
还有一种方法可以在拆分中查找正则表达式吗,例如: int(x.name.split('_')[1] “以数字开头和结尾的正则表达式”) 该版本应采用“v_00”格式,但也可能出现“version_00”。 - Derek Haynes
@DerekHaynes 这可能是一个完全不同的情况,因为它包含“_”,所以分割可能不起作用。如果您要提取数字,可以使用“lambda x: re.findall('\d+', x)[0]”。 - Chris

1

它也可以使用正则表达式,就像最初尝试的那样:

import re
v = 'topic_v7_ext2'
version_no = re.search("^[^_]*_v([0-9]+)", v)
print(version_no.group(1))

该表达式从字符串开头(^)开始搜索模式,获取所有与_不同的字符(我希望您的主题中没有一个,否则两个答案都是错误的),然后找到“_v”并获取版本号。
无需匹配_ext,因此它是否存在并不重要!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接