Предположим, у меня есть следующий 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 или словарь всех переключателей (в виде ключей) вместе со значениями. Первое буквенно-цифровое слово также является значением для ключа «name». Также должно быть внутреннее разделение по каждому атрибуту, передаваемому в rusage.
Я не могу сформировать такое сложное регулярное выражение, и разделение этого значения в каждой точке кажется очень непитоническим способом кодирования.
Ожидаемый результат:
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"
}
]
}
Любые выводы приветствуются. Спасибо.
@andrew_reece сделал это.
rusage должен быть ключом dict?
да, вместе с подключами (если возможно в какой-либо структуре данных) mem, OSME и т. д.
В этом случае отформатируйте код правильно.
но это формат, который я буду читать из текстового файла.
Я имею в виду правильно отформатировать ожидаемый выход. В настоящее время rusage записывается как переменная, а не как ключ к dict.






Вы можете разделить строку из примера с помощью shlex.split (документы здесь), регулярное выражение не требуется:
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. (объяснение регулярного выражения здесь).
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')])
это здорово. но две вещи, порядок не тот, также могу ли я дополнительно разбить данные rusage. Я обновил вопрос с ожидаемым результатом. Пожалуйста, проверьте.
Предоставьте ожидаемый результат.