匹配字符串中可选参数的正则表达式 grup

1 投票
3 回答
1862 浏览
提问于 2025-04-16 21:52

我正在尝试读取一个批处理脚本,这个脚本里包含了一个命令的输入字符串和一些可选的参数,比如:

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

感谢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等方式来获取这些值了。

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

5

在Python中,你可以使用内置的optparse或argparse模块来帮你处理这些事情,这样你就不需要去折腾那些复杂的正则表达式了,因为它们最终可能会出错:-)

撰写回答