我应该如何分割LSF字符串?

时间:2018-08-04 14:59:48

标签: python regex python-3.x

假设我有以下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"
   }
]
}

任何潜在客户均会受到赞赏。 谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用shlex.splitdocs 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')])