Форум сайта python.su
0
нужна регулярка которая умеет извлекать текст из скобок по уровню
для этого я буду использовать рекурсию
исходная строка
level_1<level_2<level_3,level_3<level_4,level_4>>,level_2<level_3,level_3>>
на 1 этапе получить строку в скобках level_1
level_2<level_3,level_3<level_4,level_4>>,level_2<level_3,level_3>
на 2 этапе получить строку в скобках level_2
level_3,level_3<level_4,level_4>
level_3,level_3 - конец рекурсии
на 3 этапе получить строку в скобках level_3
level_4,level_4 - конец рекурсии
в скобках <> может быть:
1. строка level_n
2. level_1< level_2>
3. level_1< level_2,level_2>
4. level_1< level_2<level_n,…>,level_2>
вопрос в том как корректно извлекать сроки относительно уровня вложенности
Офлайн
88
Почему нужна именно регулярка, а не что-нибудь другое?
Офлайн
253
Регулярные выражения для этого плохо подходят. Посмотрите pyparsing
Офлайн
0
Пример кода можно на pyparsing ?
Офлайн
53
romensd
сотни их
Офлайн
0
как распарсить строку
level_1<level_2_1<level_3,level_3_1<level_4,level_4_1>>,level_2_2<level_3,level_3_1_1>>
так, чтобы образовался вложений словарь
{“level_1” : {“level_2_1” : {“level_3”:{},“level_3_1”:{“level_4”:{},“level_4”:{}}} , “level_2_2”:{“level_3”:{},“level_3_1”:{}}}}
Отредактировано romensd (Июнь 23, 2015 19:30:02)
Офлайн
857
#!/usr/bin/env python3 """ Convert: level_1<level_2_1<level_3,level_3_1<level_4,level_4_1>>,level_2_2<level_3,level_3_1_1>> To: {'level_1': {'level_2_1': {'level_3': {}, 'level_3_1': {'level_4': {}, 'level_4': {}}}, 'level_2_2': {'level_3': {}, 'level_3_1': {}}}} """ import re def make_tokens(s): pat = r'level[_\d]+|<|,|>' out = [] for i in re.findall(pat, s): if i.startswith('level'): out.append(('name', i)) elif i == '<': out.append(('open', i)) elif i == ',': out.append(('sep', i)) elif i == '>': out.append(('close', i)) return out def make_tree(tokens): out = [] stack = [] cur = out for t, v in tokens: if t == 'name': cur.extend([v, []]) elif t == 'open': stack.append(cur) cur = cur[-1] elif t == 'close': cur = stack.pop() elif t == 'sep': pass return out s = 'level_1<level_2_1<level_3,level_3_1<level_4,level_4_1>>,level_2_2<level_3,level_3_1_1>>' out = make_tree(make_tokens(s)) import pprint pprint.pprint(out)
[guest@localhost py]$ ./synt.py
['level_1',
['level_2_1',
['level_3', [], 'level_3_1', ['level_4', [], 'level_4_1', []]],
'level_2_2',
['level_3', [], 'level_3_1_1', []]]]
[guest@localhost py]$
>>> {'level_1': ... {'level_2_1': ... {'level_3': {}, ... 'level_3_1': ... {'level_4': {}, ... 'level_4': {}}}, ... 'level_2_2': ... {'level_3': {}, ... 'level_3_1': {}}}} {'level_1': {'level_2_2': {'level_3': {}, 'level_3_1': {}}, 'level_2_1': {'level_3': {}, 'level_3_1': {'level_4': {}}}}} >>>
Отредактировано py.user.next (Июнь 24, 2015 11:48:47)
Офлайн
0
как возможно написать парсер который возвращает количество чилдренов
level_1< level_2_1< level_3, level_3_1<level_4,level_4_1>>, level_2_2<level_3,level_3_1_1>
[ (level_1, 2) (level_2_1,2), (level_2_2,2), (level_3,0) (level_3_1,2) (level_4,0) (level_4_1,0) (level_3,0) (level_3_1,1) ]
Отредактировано romensd (Июнь 24, 2015 09:07:42)
Офлайн
857
#!/usr/bin/env python3 """ Convert: level_1<level_2_1<level_3,level_3_1<level_4,level_4_1>>,level_2_2<level_3,level_3_1_1>> To: {'level_1': {'level_2_1': {'level_3': {}, 'level_3_1': {'level_4': {}, 'level_4': {}}}, 'level_2_2': {'level_3': {}, 'level_3_1': {}}}} """ import re def make_tokens(s): pat = r'level[_\d]+|<|,|>' out = [] for i in re.findall(pat, s): if i.startswith('level'): out.append(('name', i)) elif i == '<': out.append(('open', i)) elif i == ',': out.append(('sep', i)) elif i == '>': out.append(('close', i)) return out def make_tree(tokens): out = [] stack = [] cur = out for t, v in tokens: if t == 'name': cur.extend([v, []]) elif t == 'open': stack.append(cur) cur = cur[-1] elif t == 'close': cur = stack.pop() elif t == 'sep': pass return out def make_children(tree): out = [] name = '' for i in tree: if isinstance(i, str): name = i elif isinstance(i, list): out.append((name, len(i) // 2)) out.extend(make_children(i)) return out s = 'level_1<level_2_1<level_3,level_3_1<level_4,level_4_1>>,level_2_2<level_3,level_3_1_1>>' tree = make_tree(make_tokens(s)) out = make_children(tree) import pprint pprint.pprint(out)
[guest@localhost py]$ ./synt.py
[('level_1', 2),
('level_2_1', 2),
('level_3', 0),
('level_3_1', 2),
('level_4', 0),
('level_4_1', 0),
('level_2_2', 2),
('level_3', 0),
('level_3_1_1', 0)]
[guest@localhost py]$
Отредактировано py.user.next (Июнь 24, 2015 11:48:22)
Офлайн
0
Очень круто . Большое спасибо 
Офлайн