str = "cmd -opt1 { a b c d e f g h } -opt2"
我希望得到这样的输出:
[ 'cmd', '-opt1', '{ a b c d e f g h }', '-opt2' ]
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模块就不够用了,你需要使用带有递归功能的“新”正则表达式模块regex。
>>> 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')
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
parse_args
方法期望一个列表,就像从 sys.argv
中获取的那样;它能正确地处理一个字符串吗? - jonrsharpesys.argv
。它不能处理字符串(将其视为字符列表)。 - xtoflstr.split
方法将参数字符串转换为参数列表” - 这正是他们遇到困难的地方,因为他们的字符串包含一些希望按其进行分割的空格和一些不需要分割的空格... - jonrsharpe只需在{
和}
上分割,然后通过正常空格分割各个部分:
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']
sys.argv
获取它呢? - jonrsharpe