2016-06-07 2 views
0

Я пытаюсь разбить имя файла по частям.
Файл всегда является двоичным файлом apache (например, httpd-2.2.31.tar.gz), и мне нужна только версия (в данном случае 22) в этом конкретном формате.
Я сделал это, и она работает, но я считаю, что должен быть лучший способРазделить имя файла на python

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])) 

Можно ли сделать это в лучшую сторону?

ответ

1

, если вы хотите сделать это в одной строке, может быть это поможет:

binary_name = "httpd-2.2.31.tar.gz" 
print binary_name.split("-")[1][:3].replace('.','') 

вернется 22

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]) 
+0

Просто добавьте еще один вариант, потому что это персональный фаворит: regex101.com тоже отличный. – idjaw

+0

Это похоже на отличный сайт. –

2

использование re

(?<=-)(\d+)\.(\d+) 

См демо.

Regex101 demo

или

Pythex demo

import re 
x= "httpd-2.2.31.tar.gz" 
print re.findall(r"(?<=-)(\d+)\.(\d+)", x) 
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") 
Смежные вопросы