正则表达式用于将可选参数作为字符串中的组进行匹配

时间:2011-07-19 23:43:56

标签: python regex string optional-parameters

我正在尝试读取包含命令输入字符串和

等可选参数的批处理脚本
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'   }

但是,如果未包含任何选项,或者它们的顺序不同,则正则表达式失败。如何在这两种情况下修改我的正则表达式?

3 个答案:

答案 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.modeargs.machineargs.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等访问这些值。