2016-08-03 2 views
0

Я в принципе есть файл с этой структурой:Python простых скобки парсер

root \ 
{ 
    field1 { 
    subfield_a { 
     "value1" 
    } 
    subfield_b { 
     "value2" 
    } 
    subfield_c { 
     "value1" 
     "value2" 
     "value3" 
    } 
    subfield_d { 
    } 
    } 
    field2 { 
    subfield_a { 
     "value1" 
    } 
    subfield_b { 
     "value1" 
    } 
    subfield_c { 
     "value1" 
     "value2" 
     "value3" 
     "value4" 
     "value5" 
    } 
    subfield_d { 
    } 
    } 
} 

Я хочу разобрать этот файл с питоном, чтобы получить многомерный массив, содержащий все значения определенного подпола (для примеров subfield_c) , Например. :

tmp = magic_parse_function("subfield_c",file) 
print tmp[0] # [ "value1", "value2", "value3"] 
print tmp[1] # [ "value1", "value2", "value3", "value4", "value5"] 

Я довольно уверен, что я использовать класс Pyparsing, но я не с чего начать, чтобы установить регулярное выражение (?). Может ли кто-нибудь дать мне несколько указателей?

+0

Если ваш ввод такой же простой, как и вы, который вы отправили, вам даже не нужен pyparsing, и вы можете попытаться написать свой собственный токенизатор, который управляет стеком, чтобы узнать его глубину. [Здесь] (http://stackoverflow.com/a/4285211/1011859) someones делает это с круглыми скобками и без содержимого. Считаете ли вы, что можете попытаться адаптировать это? Если нет, я могу попытаться дать еще несколько указателей. (BTW: регулярные выражения не могут рассчитывать, поэтому будьте осторожны при попытке использовать их для такого рода задач) – pistache

+0

Как именно вы изменяете строки в Python, мне любопытно? :) – pistache

+1

В основном я удалил \ n, заменил фигурные скобки обычными скобками, и я удалил «\ t». Затем я пытаюсь выяснить, как я могу извлечь только то, что мне нужно, но это не имеет большого значения. Трудная часть состояла в том, чтобы иметь массив с правильной информацией. – haster8558

ответ

1

Вы можете позволить Pyparsing заботиться о согласовании и итерации над входом, просто определить, что вы хотите, чтобы соответствовать, и передать его тело файла в виде строки:

def magic_parse_function(fld_name, source): 
    from pyparsing import Keyword, nestedExpr 

    # define parser 
    parser = Keyword(fld_name).suppress() + nestedExpr('{','}')("content") 

    # search input string for matching keyword and following braced content 
    matches = parser.searchString(source) 

    # remove quotation marks 
    return [[qs.strip('"') for qs in r[0].asList()] for r in matches] 

# read content of file into a string 'file_body' and pass it to the function 
tmp = magic_parse_function("subfield_c",file_body) 

print(tmp[0]) 
print(tmp[1]) 

принты:

['value1', 'value2', 'value3'] 
['value1', 'value2', 'value3', 'value4', 'value5']