str = "cmd -opt1 { a b c d e f g h } -opt2"
我想要这样的输出:
[ 'cmd', '-opt1', '{ a b c d e f g h }', '-opt2' ]
答案 0 :(得分:5)
在这种情况下,请勿尝试拆分,请使用re.findall
:
>>> import re
>>> re.findall(r'{[^}]*}|\S+', 'cmd -opt1 { a b c d e f g h } -opt2')
['cmd', '-opt1', '{ a b c d e f g h }', '-opt2']
如果你必须处理嵌套的花括号,re模块是不够的,你需要使用具有递归功能的"new" regex module。
>>> import regex
>>> regex.findall(r'[^{}\s]+|{(?:[^{}]+|(?R))*+}', 'cmd -opt1 { a b {c d} e f} -opt2')
['cmd', '-opt1', '{ a b {c d} e f}', '-opt2']
(?R)
指的是整个模式本身。
或者这个(更好):
regex.findall(r'[^{}\s]+|{[^{}]*+(?:(?R)[^{}]*)*+}', 'cmd -opt1 { a b {c d} e f} -opt2')
答案 1 :(得分:4)
答案 2 :(得分:2)
请查看the argparse
module,因为我假设您正在编写代码来解析程序的参数。通常这些参数存储在sys.argv
中,因此您甚至不需要关心拆分命令行字符串。如果您坚持使用命令行,则可以使用str.split
方法将参数字符串转换为参数列表。
import argparse
parser = argparse.ArgumentParser(description='whatever cmd does.')
parser.add_argument('--opt1', metavar='N', type=int, nargs='+',
help='integers')
options = parser.parse_args()
for n in options.opt1:
# do something with n
答案 3 :(得分:0)
只需在{
和}
上拆分,然后按常规空间拆分各个部分:
str = "cmd -opt1 { a b c d e f g h } -opt2"
>>> a, b = str.split("{")
>>> c, d = b.split("}")
>>> a.split() + ["{{{0}}}".format(c)] + d.split()
['cmd', '-opt1', '{ a b c d e f g h }', '-opt2']