我想从文件名中提取软件名称及其版本,以便我可以过滤最新版本的软件。文件名的组织形式为 name-version.crate
,但 name
和 version
都可以包含 -
。
我尝试先使用正则表达式提取版本,然后使用 find 找到将 name
与 version
分开的 -
,看起来可行在大多数情况下,但无法处理那些具有 -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.6
,StrictVersion
用于比较版本。
最佳答案
您可以使用
(?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/