匹配字符串中可选参数的正则表达式 grup
我正在尝试读取一个批处理脚本,这个脚本里包含了一个命令的输入字符串和一些可选的参数,比如:
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.mode
、args.machine
和 args.port
。
5
在Python中,你可以使用内置的optparse或argparse模块来帮你处理这些事情,这样你就不需要去折腾那些复杂的正则表达式了,因为它们最终可能会出错:-)