2013-05-17 3 views
0

Необходимо проанализировать вывод команды в python. Команда возвращает что-то вроде этогоКомандный вывод комплекса синтаксического анализа Python

A: 
     2 bs found 
     3 cs found 
B: 
     1 a found 
     3 bs found 
C: 
     1 c found 
     D: 
       2 es found 
       3 fs found 

нуждающегося в состоянии выполнить следующие действия с выходом:

a.bs доступа найдено b.a найдено. c.d.es найдено и так далее.

Как это сделать python? Какая структура данных лучше всего подходит для этого?

Цель этого упражнения запустить команду каждые 10 секунд и определить дифференциал, что изменилось

+0

Как сделать код внутри вопроса? Выходной формат моей команды искажен. – user2322491

+0

Вы можете выбрать блок кода, который можно нажать 'ctrl + k'. – satoru

+1

Чтобы уточнить - это '{{' и '}}}' собственно часть вашего вывода, или это была попытка сделать его блоком кода? –

ответ

0

Это должны иметь «синтаксический анализ» тег, как это общая проблема синтаксического анализа.

Обычное решение в такой ситуации - отслеживать a) отступ и b) список структур, которые в настоящее время обрабатываются, когда вы читаете строки. b начнется как список, содержащий один пустой dict, т. е. curparsing = [{}]

Петля на всех входных линиях. Например:

with open('inputfilename','r') as f: 
    for line in f: 
     # code implementing the below rules. 
  • если строка пустая (if not line.strip():), игнорируйте его и перейти на следующий (continue)

  • если уровень отступа уменьшился, мы должны удалить верхнюю в списке текущего анализа (т. е. curparsing.pop()). если обнаружено множественное снижение, мы должны удалить несколько элементов сверху.

  • сдирать любой ведущей отступов с line=line.lstrip()

  • если «:» в строке, то мы нашли суб-словаря. Прочтите ключ (часть слева от ':'), увеличьте уровень отступов, создайте новый словарь и вставьте его в словарь в текущей верхней части списка. Затем добавьте наш недавно созданный словарь в список.

  • if line[0] in '123456789': После этого мы обнаружили сообщение '[count] [character] s found'. мы можем использовать регулярные выражения, чтобы найти счетчик и символ, с m = re.match('([1-9]+) ([a-z])'); count, character = m.groups(); count = int(count). Затем мы сохраняем это в словарь на текущей вершине списка: curparsing[-1][character] = count

Это довольно много его. Вы просто перебираете строки и применяете эти правила к каждой строке, а в конце curparsing[0] содержит анализируемый документ.

+0

Спасибо за указатель. Попробуй и расскажешь, как это происходит – user2322491

2

Альтернативное решение - это преобразование входной строки непосредственно в нечто, что может быть прочитана ранее существовавшей библиотекой. Эти данные выглядят как подходящие для YAML.

В этом случае вы будете re.sub('(+)([1-9]+) ([a-z]).+', '\\1\\3 : \\2', allcontent), который переписывает строки типа «2 cs found» в сопоставление значений ключей: значение, которое понимает pyYAML. Точнее, форма «2 cs found» становится «c: 2»

результат?

A: 
     b : 2 
     c : 3 
B: 
     a : 1 
     b : 3 
C: 
     c : 1 
     D: 
       e : 2 
       f : 3 

выполнения yaml.load(newcontent) возвращает следующую структуру питон данных:

{'A': {'b': 2, 'c': 3}, 
'B': {'a': 1, 'b': 3}, 
'C': {'D': {'e': 2, 'f': 3}, 'c': 1}} 

, который соответствует моему предложению в моем предыдущем комментарии. Если вы предпочитаете json (Python поставляется с модулем json), довольно просто адаптировать эту стратегию для создания JSON.

Смежные вопросы