我尝试拆分文件名,按部分使用它。
该文件始终是一个apache二进制文件(例如,httpd-2.2.31.tar.gz),我只需要该特定格式的版本(在本例中为22)。
我已经完成了它并且它有效,但我相信应该有更好的方法
binary_name = "httpd-2.2.31.tar.gz"
app, ver_tar = binary_name.split("-")
version = ver_tar.split(".")
print ("Version %s%s" % (version[0], version[1]))
是否有可能以更好的方式做到这一点?
答案 0 :(得分:2)
使用re
(?<=-)(\d+)\.(\d+)
参见演示。
或
import re
x= "httpd-2.2.31.tar.gz"
print re.findall(r"(?<=-)(\d+)\.(\d+)", x)
答案 1 :(得分:1)
如果您想在一行中完成,可能会有所帮助:
binary_name = "httpd-2.2.31.tar.gz"
print binary_name.split("-")[1][:3].replace('.','')
将返回22
答案 2 :(得分:0)
使用regular expressions可以让它更容易一些。有一个名为Pythex的漂亮网站,您可以自己试验这些网站。修复你的例子:
import re
r = re.compile(".*-(\d+\.\d+\.\d+).tar.gz")
print(r.match("httpd-2.2.21.tar.gz").groups()[0])
答案 3 :(得分:0)
只要您的代码解决了您要解决的问题,就更好的方式就是没有这样的东西,在这种情况下它确实存在。就性能而言,可能有更快的方法来实现相同的功能,但即使使用数千个字符串列表来解析速度上的差异也是最小的或无法区分的。因此,我假设您正在寻求一种不同的方式来实现相同的目标,所以我编写了一个小函数和几个测试段。该功能提供了更多的控制。
def get_version(file_name, accuracy=0, sep=None):
'''
:string file_name is the string you want to parse
:int accuracy is the length of the output format
1 = 1 of 1.23.3
2 = 1.2 of 1.23.3
3 = 1.23 of 1.23.3
0 = 1.23.3 or full length
:string sep, is the string seperator you wish to use, 1.1, 1_1, 11 etc...
'''
if not sep:
sep = ''
data = file_name.split('.')
str_ver = data[0:-2]
ver = []
for i in str_ver:
if len(ver) < accuracy or accuracy == 0:
try:
if len(i)>1:
n = ''
for x in i:
try:
n+=str(int(x))
except:
pass
else:
n = str(int(i))
ver.append(n)
except:
pass
return sep.join(ver)
print get_version("httpd-2.2.31.tar.gz", 1, '--')
print get_version("httpd-2.2.31.tar.gz", 2, '::')
print get_version("httpd-2.2.31.tar.gz", 3, '_')
print get_version("httpd-2.2.31.tar.gz", 2)#what you were asking for
print get_version("httpd-2.2.31.tar.gz")