我有一个如下列表:
commandOptionsAndArguments = ['myBigTool', '--num-callers', '30', '--leak-check', 'full', '--tool', 'memcheck', '--suppressions', 'etc/valgrind-root.supp', '--suppressions', 'Gaudi.supp/Gaudi.supp', '--suppressions', 'oracleDB.supp', '--suppressions', 'valgrindRTT.supp', '--suppressions', 'root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
该列表由Bash命令的元素组成,这些元素具有选项,如果有选项,还包括它们各自的参数。我想将其转换为以下列表:
commandOptions = ['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
这个新列表由选项组成,如果有选项,则使用等号将它们各自的参数组合成新元素。下一步是使用子流程执行此命令,或者将其转换为字符串以用于os.system
:
" ".join(commandOptions)
# 'myBigTool --num-callers=30 --leak-check=full --tool=memcheck --suppressions=etc/valgrind-root.supp --suppressions=Gaudi.supp/Gaudi.supp --suppressions=oracleDB.supp --suppressions=valgrindRTT.supp --suppressions=root.supp/root.supp --mySpecialFlag $(which python) $(which athena.py) athenaConf.pkl'
我的问题是:如何以稳健的方式将列表commandOptionsAndArguments
更改为列表commandOptions
,并适当地检测带参数和不带参数的选项?
(此外,如果有人对提到的列表有更好的名字,请随时提出。我不确定应该用什么词来描述使用等号来指定命令选项的参数,而不是使用空格。)
您可以在此处使用re
模块。
>>> commandOptionsAndArguments = ['myBigTool', '--num-callers', '30', '--leak-check', 'full', '--tool', 'memcheck', '--suppressions', 'etc/valgrind-root.supp', '--suppressions', 'Gaudi.supp/Gaudi.supp', '--suppressions', 'oracleDB.supp', '--suppressions', 'valgrindRTT.supp', '--suppressions', 'root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
>>> re.split(r's+(?![^()]*))', re.sub(r'(--S+)s+(wS+)', r'1=2', ' '.join(commandOptionsAndArguments)))
['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
解释:
' '.join(commandOptionsAndArguments)
用空格作为分隔符来连接给定列表中的所有元素。这用
=
符号替换了以--
开头的单词和以单词字符开头的单词()之间的=中存在的空格。因此它不会取代--mySpecialFlag
和$(which python)
之间存在的空格。re.sub(r'(--S+)s+(wS+)', r'1=2', ' '.join(commandOptionsAndArguments))
最后,该
r's+(?![^()]*))'
匹配不存在于()
括号内的一个或多个空间。通过根据匹配的空格分割结果字符串,将为您提供所需的输出。
您可以使用切片:
>>> [commandOptionsAndArguments[0]]+['='.join(commandOptionsAndArguments[1:][i:i+2]) for i in range(0,len(commandOptionsAndArguments)-1,2)]
['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag=$(which python)', '$(which athena.py)=athenaConf.pkl']
>>>