如何将表示Bash命令元素的列表中的元素组合为以等号为特征的新列表



我有一个如下列表:

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']
>>> 

最新更新