2011-01-18 12 views
8

के लिए पार्सिंग कमांड लाइन इनपुट मैं एक कमांड लाइन एप्लिकेशन लिख रहा हूं और उपयोगकर्ता को संख्याओं को अलग-अलग संख्याओं या सीमा के रूप में दर्ज करने में सक्षम होना चाहता हूं। तो, उदाहरण के लिए:संख्या

$ myapp -n 3,4,5,6 

या

$ myapp -n 3-6 

मैं अपने ऐप एक अजगर सूची जैसे में इन डाल करने के लिए चाहते हैं, [3, 4, 5, 6] मैं optparse उपयोग कर रहा हूँ, लेकिन मुझे यकीन नहीं है कि इनपुट की इन दो शैलियों से सूची कैसे बनाएं। कुछ उदाहरण कोड बहुत अच्छा होगा।

संपादित

मैं भी एक से अधिक श्रेणियों में प्रवेश करने में सक्षम होना चाहते हैं:

$ 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

एक और बात मैं कई श्रेणियों में प्रवेश करने में सक्षम होना चाहता हूं उदा।, मैप 22-27, 51-64 – normski

+1

@ नोर्मस्की: दाएं।उपर्युक्त कोड इसे संभाल सकता है, जब तक आप '22-27,' और '51-64' के बीच कोई स्थान नहीं डालते। (इस तरह पूरी स्ट्रिंग को 'opt.n'' में लोड किया गया है।) – unutbu

3

यदि आपके पास एन-ARG एक स्ट्रिंग में आप कर सकते हैं:

def f(s): 
    if '-' in s: 
     i = s.index('-') 
     return range(*map(int, s.split('-'))) 
    return map(int, s.split(',')) 

कुछ उदाहरण:

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

फिर दूसरे पैरामीटर में 1 जोड़ें ... –

1

आप optparse लाइब्रेरी का उपयोग कर सकते हैं।

उदाहरण:

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

आप अपने तर्क को परिभाषित करने और सहेजने से पहले अपने इनपुट पर कार्रवाई करने के optparse callback उपयोग कर सकते हैं:

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]