我正在尝试读取包含命令输入字符串和
等可选参数的批处理脚本input = 'command -a field1 -b field2 -c field3'
选项参数由用户在文件中设置,我通过读取文件获取字符串。如果包含该选项,我需要提取该字段。
我目前有我的正则表达式:
expr = '^(?P<exec>[^\s]+) -m (?P<mode>[^\s]+) -d (?P<machine>[^\s]+) -p (?P<port>[^\s]+)'
m = re.match(expr, input)
当用户以相同的顺序包含所有选项时,正则表达式匹配字符串并捕获组。这是一个示例输出。
{ 'exec': 'custom-script',
'mode': 'debug',
'machine': 'desk-123',
'port': '7905' }
但是,如果未包含任何选项,或者它们的顺序不同,则正则表达式失败。如何在这两种情况下修改我的正则表达式?
答案 0 :(得分:5)
在Python中,您可以使用内置的optparse或argparse模块为您执行此操作,这样您就不必使用最终会失败的硬核正则表达式: - )
答案 1 :(得分:2)
使用python中的正则表达式解析命令行选项非常脆弱 - argparse将允许您处理所需的所有参数,包括可选和位置,并提供丰富的操作它们的能力。它甚至会自动为您构建-h
选项!
例如,在您的情况下,您说您已经提供了输入,因此您可以执行以下操作:
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-m','--mode', help='The mode to run in')
parser.add_argument('-d','--machine', help='The machine of interest')
parser.add_argument('-p','--port', help='The port of interest')
args = parser.parse_args(input.split())
此输出args
将具有不同的字段作为属性,即args.mode
,args.machine
,args.port
答案 2 :(得分:0)
感谢Nate,我使用了optparse而不是正则表达式,并使用了以下代码:
parser = optparse.OptionParser(description='Process some integers.')
parser.add_option('-m','--mode', help='The mode to run in')
parser.add_option('-d','--machine', help='The machine of interest')
parser.add_option('-p','--port', help='The port of interest')
(args, others) = parser.parse_args(input.split())
现在,我可以通过args.mode,args.machine等访问这些值。