假设我有以下LSF:
873411_ExtraNode -q lnx64 -P someprog:98.90:PV:DY -W 90:08 -R "rusage[mem=5000] select[(OSME==Linux) && ( (OEL==EV70&&SFIPLATFORM>=c0896)||(OEL==EG70&&SFIPLATFORM>=d0298)||(OEL==SHGS12&&SFIPLATFORM>=d0298)||(OEL==SHGS11&&SFIPLATFORM>=d0290))]"
我想要的是将其拆分为一种方式,以便我可以获取所有开关(作为键)以及值的JSON或字典。第一个字母数字单词也是“名称”键的值。 此外,传递给rusage的每个属性都应进行内部拆分。
我无法形成如此复杂的正则表达式,并且在每个点上拆分此值似乎是一种非常不符合Python的方式。
预期输出:
lsf =
{ "name" : "873411_ExtraNode",
"-q" : "lnx64",
"-P" : "someprog:98.90:PV:DY",
"-W" : "90:08",
"-R" : "rusage"
"rusage" :[
{
"mem" : "5000",
"OSME" : "Linux",
"OEL" : "EV70, EG70, SHGS12, SHGS11",
"SFIPLATFORM" : ">=c0896, d0298, d0298, d0290"
}
]
}
任何潜在客户均会受到赞赏。 谢谢。
答案 0 :(得分:0)
您可以使用shlex.split
(docs here)从示例中拆分字符串,而无需使用正则表达式:
import shlex
from pprint import pprint
s = '''873411_ExtraNode -q lnx64 -P someprog:98.90:PV:DY -W 90:08 -R "rusage[mem=5000] select[(OSME==Linux) && ( (OEL==EV70&&SFIPLATFORM>=c0896)||(OEL==EG70&&SFIPLATFORM>=d0298)||(OEL==SHGS12&&SFIPLATFORM>=d0298)||(OEL==SHGS11&&SFIPLATFORM>=d0290))]"'''
l = shlex.split(s)
d = {switch:value for switch, value in zip(l[1::2], l[2::2])}
d['name'] = l[0]
pprint(d)
打印:
{'-P': 'someprog:98.90:PV:DY',
'-R': 'rusage[mem=5000] select[(OSME==Linux) && ( '
'(OEL==EV70&&SFIPLATFORM>=c0896)||(OEL==EG70&&SFIPLATFORM>=d0298)||(OEL==SHGS12&&SFIPLATFORM>=d0298)||(OEL==SHGS11&&SFIPLATFORM>=d0290))]',
'-W': '90:08',
'-q': 'lnx64',
'name': '873411_ExtraNode'}
编辑:
要解析-R
参数,可以使用re
。 (explanation of regex here)。
import shlex
import re
from collections import defaultdict, OrderedDict
from pprint import pprint
s = '''873411_ExtraNode -q lnx64 -P someprog:98.90:PV:DY -W 90:08 -R "rusage[mem=5000] select[(OSME==Linux) && ( (OEL==EV70&&SFIPLATFORM>=c0896)||(OEL==EG70&&SFIPLATFORM>=d0298)||(OEL==SHGS12&&SFIPLATFORM>=d0298)||(OEL==SHGS11&&SFIPLATFORM>=d0290))]"'''
def parse_r(s):
d = defaultdict(list)
groups = re.finditer(r'rusage.*?(?P<rusage>\d+)|OSME.*?(?P<osme>\w+)|OEL.*?(?P<oel>\w+)|SFIPLATFORM.*?(?P<sfiplatform>[<>=\w]+)', s)
for g in groups:
for k, v in g.groupdict().items():
if not v:
continue
d[k] += [v]
return d
l = shlex.split(s)
d = OrderedDict(( (switch, value) for switch, value in zip(l[1::2], l[2::2]) ))
d['name'] = l[0]
d['-R'] = parse_r(d['-R'])
pprint(d)
打印:
OrderedDict([('-q', 'lnx64'),
('-P', 'someprog:98.90:PV:DY'),
('-W', '90:08'),
('-R',
defaultdict(<class 'list'>,
{'oel': ['EV70', 'EG70', 'SHGS12', 'SHGS11'],
'osme': ['Linux'],
'rusage': ['5000'],
'sfiplatform': ['>=c0896',
'>=d0298',
'>=d0298',
'>=d0290']})),
('name', '873411_ExtraNode')])