python - 提取名称和版本号,并避免不匹配?

标签 python regex string version-control

我想从文件名中提取软件名称及其版本,以便我可以过滤最新版本的软件。文件名的组织形式为 name-version.crate,但 nameversion 都可以包含 -

我尝试先使用正则表达式提取版本,然后使用 find 找到将 nameversion 分开的 -,看起来可行在大多数情况下,但无法处理那些具有 -number 样式的名称。

我的代码是这样的

from distutils.version import StrictVersion
import re

reg_str = r'(?P<name>.*)-(?P<version>\d+\.\d+\.\d+)[+.-](?P<crate>.*)'
org_str = r'\s*-([\d.]+)'

def demo(crate):   
    tmp = crate[:-6]
    verstr =""
    try:
        #verstr = re.search(reg_str, tmp).group(1)
        x = re.search(reg_str, tmp)
        verstr = x.group('version')
        print(x.group('name')),
        print(verstr),
        print(x.group('crate'))
        dash_location = crate.find(verstr)
        name = crate[:dash_location-1]
        #version = StrictVersion(verstr)
    except NameError:
        print("NameError in StrictVersion for ({}), verstr is ({})".format(crate, verstr))
    except:
        print("Exception StrictVersion for ({}), verstr is ({})".format(crate, verstr))


if __name__ == "__main__":
    cases = ["substudy-0.4.1-pre.1.crate","google-reseller1_sandbox-cli-0.3.6+20160329.crate","tis-100-0.1.3.crate"]
    for i in cases:
        demo(i)

一些导致异常的测试用例:

substudy-0.4.1-pre.1.crate
google-reseller1_sandbox-cli-0.3.6+20160329.crate
tis-100-0.1.3.crate

我使用的是python-3.6StrictVersion用于比较版本。

最佳答案

您可以使用

(?P<name>.*)-(?P<version>\d+\.\d+\.\d[^.]*)\.(?P<crate>.*)

请参阅regex demo .

详细信息:

  • (?P<name>.*) - 任何 0+ 个尽可能多的字符,直到最后一个...
  • - - 连字符
  • (?P<version>\d+\.\d+\.\d[^.]*) - 1+ 位数字,. , 1+ 位, . ,1 位数字,然后是 . 之外的 0+ 个字符最多...
  • \. - 一个点
  • (?P<crate>.*) - 该行的所有其余部分。

一个Python demo :

import re
ss = ['substudy-0.4.1-pre.1.crate','google-reseller1_sandbox-cli-0.3.6+20160329.crate','tis-100-0.1.3.crate','gobject-2-0-sys-0.46.0.crate']
rx = re.compile(r'(?P<name>.*)-(?P<version>\d+\.\d+\.\d[^.]*)\.(?P<crate>.*)')
for s in ss:
    m = rx.search(s)
    if m:
        print("------------------")
        print("INPUT: {}".format(s))
        print("NAME: {}".format(m.group("name")))
        print("VERSION: {}".format(m.group("version")))
        print("CRATE: {}".format(m.group("crate")))

输出:

------------------
INPUT: substudy-0.4.1-pre.1.crate
NAME: substudy
VERSION: 0.4.1-pre
CRATE: 1.crate
------------------
INPUT: google-reseller1_sandbox-cli-0.3.6+20160329.crate
NAME: google-reseller1_sandbox-cli
VERSION: 0.3.6+20160329
CRATE: crate
------------------
INPUT: tis-100-0.1.3.crate
NAME: tis-100
VERSION: 0.1.3
CRATE: crate
------------------
INPUT: gobject-2-0-sys-0.46.0.crate
NAME: gobject-2-0-sys
VERSION: 0.46.0
CRATE: crate

关于python - 提取名称和版本号,并避免不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836155/

相关文章:

Python 类型错误 : 'List' object is not callable

java - 从输入字符串中的数组中搜索关键字并打印它们

c# - 子字符串格式化以获取第一个下划线之后但第二个下划线之前的所有字符?

java - 输出不带插入符号的 X^n

string - 两个字符串 S1 和 S2 的最后一个字符匹配的相等子序列数

python - Pandas - 在带有 numpy 数组的 MultiIndexed DataFrame 上执行 mean()

Python:防止 Pandas 系列中的值四舍五入为整数

Python Ripple 携带 Adder?

python - 非贪婪前瞻正则表达式

带有变量的 Python 正则表达式 findall