2011-01-18 6 views
8

私はコマンドラインアプリケーションを作成しており、ユーザーは数字を個々の数字または範囲として入力できるようにしたいと考えています。したがって、たとえば:私は私のアプリは、Pythonのリストなどにこれらを入れたい数字用のコマンドライン入力の解析

$ myapp -n 3,4,5,6 

または

$ myapp -n 3-6 

、[3、4、5、6]私はoptparseを使用してい 、これら2つの入力形式からリストを作成する方法がわかりません。いくつかのコード例は素晴らしいでしょう。

$ myapp -n 22-27, 51-64 
+0

関連:http://stackoverflow.com/questions/4248399/page-range-for-printing-algorithm –

答えて

13
import argparse 

def parse_range(astr): 
    result = set() 
    for part in astr.split(','): 
     x = part.split('-') 
     result.update(range(int(x[0]), int(x[-1]) + 1)) 
    return sorted(result) 

parser = argparse.ArgumentParser() 
parser.add_argument('-n', type=parse_range) 
args = parser.parse_args() 
print(args.n) 

利回り

% script.py -n 3-6 
[3, 4, 5, 6] 

% script.py -n 3,6 
[3, 6] 

% script.py -n 22-27,51-64 
[22, 23, 24, 25, 26, 27, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64] 
+1

ありがとう。これは私の要求に完全に対応しているようです。 – normski

+0

複数の範囲を入力できるようにもう1つ例myapp 22-27,51-64 – normski

+1

@normski:右。'22-27 'と' 51-64'の間にスペースを入れない限り、上記のコードはそれを扱うことができます。 (その方法で、文字列全体が 'opt.n'に読み込まれます。) – unutbu

3

あなたは、n-argをあなたが行うことができ、文字列にしている場合:

def f(s): 
    if '-' in s: 
     i = s.index('-') 
     return range(*map(int, s.split('-'))) 
    return map(int, s.split(',')) 
を私も複数の範囲を入力できるようにしたいと思い

EDIT

例:

In [3]: s = '1, 2, 3, 4, 5, 6' 

In [4]: f(s) 
Out[4]: [1, 2, 3, 4, 5, 6] 

In [5]: f('3-6') 
Out[5]: [3, 4, 5] 

In [6]: f('3-16-3') 
Out[6]: [3, 6, 9, 12, 15] 
+0

私はこの解決策が好きです。私はいくつかの入力バリデーションを見たいと思います。それは本当にすべてです:)入力リストが巨大であれば、それはかなり最適ではありませんが、そうではないと思われます。 – Skurmedel

+2

これには上限境界も含まれません。 –

1

Python's range functionを使用してください。ユーザーの入力を解析し、 ' - '文字で分割し、それらのパラメータを範囲に渡します。

parameters = input.split('-') 
completeRange = range(int(parameters[0]), int(parameters[1])) 

彼らは、個々の数字を入力した場合、あなただけの非常に簡単にリストにそれを解析することができます。

あなたのコードは次のようになります。

+1

これは、必要に応じて上限を含みません。 –

+1

次に、2番目のパラメータに1を加えてください。 –

1

あなたはoptparseライブラリを使用することができます。

例:あなたは、あなたの引数を定義し、それを保存する前に、あなたの入力を処理するためにoptparse callbackを使用することができます

from optparse import OptionParser 

opt_parser = OptionParser(version="%prog 0.1") 
opt_parser.usage = '%prog [options]\n\nTCP protocol reengineering tool' 

# Options 
opt_parser.add_option('-n', default="1,2,3") 
(options, args) = opt_parser.parse_args() 

list = [] 
for s in options.n.split(","): 
    list.append(int(s)) 
2

from optparse import OptionParser 

parser = OptionParser() 

def create_range_callback(option, opt, value, parser): 
    i, j = map(int, value.split('-')) 
    setattr(parser.values, option.dest, range(i, j+1)) 

parser.add_option("-r", "--range", action="callback", 
        callback=create_range_callback, 
        type="string", dest='list') 

(options, args) = parser.parse_args() 

print options.list 

が今やって:

python2.7 test.py -r 1-5 

出力:

[1, 2, 3, 4, 5] 
関連する問題