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

Python 用于将可选参数作为字符串中的组进行匹配的正则表达式,python,regex,string,optional-parameters,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

我试图读取一个包含命令输入字符串和可选参数的批处理脚本,如

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)

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

在Python中,您可以使用内置的optparse或argparse模块为您执行此操作,这样您就不必担心最终会失败的硬核正则表达式:-)

在Python中,您可以使用内置的optparse或argparse模块为您执行此操作,这样您就不必担心了对最终会失败的硬核正则表达式坐立不安:-)

用python中的正则表达式解析命令行选项是非常脆弱的-可以让您处理所需的所有参数,包括可选参数和位置参数,并提供丰富的操作能力。它甚至会自动为您构建一个
-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
,在python中用正则表达式解析命令行选项是非常脆弱的-可以让您处理所有需要的参数,包括可选参数和位置参数,并提供了丰富的操作能力。它甚至会自动为您构建一个
-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
,多亏了Nate,我使用了optpasse而不是regex,并使用了以下代码:

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等访问值。

多亏了Nate,我使用了optpasse而不是regex,并使用了以下代码:

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等访问这些值。

是!不要重新发明轮子!不幸的是,我只能访问一个包含输入字符串的批处理脚本文件。我只是读取行,如果匹配,则提取值以进行进一步处理。可以用于将源字符串拆分为args列表,这肯定会更容易单独解析,但也可以将结果传递到optpass/argparse中,以代替默认脚本args。所以你可以把它们用在你的案子上。是的!不要重新发明轮子!不幸的是,我只能访问一个包含输入字符串的批处理脚本文件。我只是读取行,如果匹配,则提取值以进行进一步处理。可以用于将源字符串拆分为args列表,这肯定会更容易单独解析,但也可以将结果传递到optpass/argparse中,以代替默认脚本args。所以你可以在你的案例中使用它们。只是编辑我的问题来澄清一下。我不是在建立指挥部。相反,我正在解析一个包含输入字符串的批处理脚本,并试图提取信息
argparse
仍然可以处理这种情况,所以我相应地编辑了我的答案!工作得很好!谢谢这件事让我绞尽脑汁已经有一段时间了。它甚至对人类友好,所以我赢了;当我交出这段代码时,我没有太多的文档:)args是tuple类型的。但是当我试着打印args时,我得到了一本字典。当我尝试访问args.mode时,我得到AttributeError:“tuple”对象没有属性“mode”。对我来说,
type(args)
返回
——当我运行
str(args)
时,我得到以下内容:
“名称空间(machine='field2',mode='field1',port='field3')”
-您正在运行什么版本的python?刚刚编辑了我的问题以澄清。我不是在建立指挥部。相反,我正在解析一个包含输入字符串的批处理脚本,并试图提取信息
argparse
仍然可以处理这种情况,所以我相应地编辑了我的答案!工作得很好!谢谢这件事让我绞尽脑汁已经有一段时间了。它甚至对人类友好,所以我赢了;当我交出这段代码时,我没有太多的文档:)args是tuple类型的。但是当我试着打印args时,我得到了一本字典。当我尝试访问args.mode时,我得到了AttributeError:“tuple”对象没有属性“mode”。对我来说,
type(args)
返回
——当我运行
str(args)
时,我得到以下信息:
“名称空间(machine='field2',mode='field1',port='field3')”
-您运行的是什么版本的python?