在列表中查找最新版本

时间:2018-06-22 22:05:47

标签: python python-3.x data-structures version

我可以在文件夹中搜索所有版本日志行,但是我试图选择列表中的最新版本,但是我不知道怎么做,因为列表中的元素同时包含字符和数字。

下面是我的代码,用于查找和创建一个名为“ matched_lines”的列表,该列表包含说明日志版本号的所有行。我希望从创建的此列表中找到最新版本,并将此最新版本与日志外部的实际最新版本进行比较。例如,生成的列表将包含:

['版本2.13.1.1','版本2.12.1.0','版本2.10.1.4']

在此示例中,我希望选择“版本2.13.1.1”,并将其与日志的最新版本号进行比较,例如“版本2.14.1.0”。

    for filename in files:

            #print('start parsing... ' + str(datetime.datetime.now()))
            matched_line = []
            try:
                with open(filename, 'r', encoding = 'utf-8') as f:
                    f = f.readlines()
            except:
                with open(filename, 'r') as f:
                    f = f.readlines()                 

            # print('Finished parsing... ' + str(datetime.datetime.now()))

            for line in f:
                #0strip out \x00 from read content, in case it's encoded differently
                line = line.replace('\x00', '')

                #regular expressions to fidn the version log lines for each type
                RE1 = r'^Version \d.\d+.\d.\d' #Sample regular expression

                pattern2 = re.compile('('+RE1+')', re.IGNORECASE)

                #for loop that matches all the available version log lines
                for match2 in pattern2.finditer(line):
                    matched_line.append(line)

在此列表中找到最新版本后,我希望将其与文件夹之外的实际最新版本号进行比较。

3 个答案:

答案 0 :(得分:3)

首先,您需要从字符串中捕获版本号,并将其转换为tuple形式的int中的(major, minor, micro)。将其用作key函数的max将返回最新版本。

代码

import re

def major_minor_micro(version):
    major, minor, micro = re.search('(\d+)\.(\d+)\.(\d+)', version).groups()

    return int(major), int(minor), int(micro)

示例

versions = ['Version 2.13.1.1', 'Version 2.12.1.0', 'Version 2.10.1.4']
latest = max(versions, key=major_minor_micro)

print(latest) # 'Version 2.13.1.1'

答案 1 :(得分:1)

可以通过与当前packaging.version.parse有关的PEP 440轻松实现。

>>> from packaging import version
>>>
>>> vers = ['Version 2.13.1.1', 'Version 2.12.1.0', 'Version 2.10.1.4']
>>>
>>> for n, i in enumerate(vers):
...     vers[n] = version.parse(i)
...
>>> max(vers)
<LegacyVersion('Version 2.13.1.1')>
>>>

答案 2 :(得分:-1)

您可以对列表进行排序,然后获得最大的(最后一个)项目。但是您想要自然排序,例如:'Version 2.4.1.1' < 'Version 2.13.1.1'

我在Does Python have a built in function for string natural sort?中找到了执行此操作的函数。这是

的示例
import re

def sorted_nicely(an_iterable):
    """ Sorts the given iterable in the way that is expected.

    Required arguments:
    an_iterable -- The iterable to be sorted.

    """
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
    return sorted(an_iterable, key = alphanum_key)

version_list = ['Version 2.13.1.1', 'Version 2.123.1.0', 'Version 2.4.1.4']

print(sorted_nicely(version_list)[-1])  # "Version 2.123.1.1"