2014-12-14 3 views
2

, поэтому я ищу, чтобы разобрать строку и сгладить ее, которая содержит переменную глубину чисел.Итеративный анализ без XML?

Вот пример строки:

'(7&(10&(22|25))|(22&25)|(25&(10|22)))|(9&(10&(22|25))|(22&25)|(25&(10|22)))|(33&22&25)' 

Что это означает, что у нас есть 3 разные возможности в первом уровне, как представлено в этом списке:

['7&(10&(22|25))|(22&25)|(25&(10|22))', '9&(10&(22|25))|(22&25)|(25&(10|22))', '33&22&25'] 

Последние вариант в этом списке может быть только одним (поскольку он не имеет внутренних уровней).

Однако первый довольно изменчив :, поэтому я остановлюсь на этом: «7 &» означает, что каждый элемент этого уровня имеет 7.

Итак, мы извлечь уровни ребенка из что, и мы получаем:

['10&(22|25)', '22&25', '25&(10|22)'] 

так вот, индекс 1 тупиковый, так что наш конечный результат для этого дерева «7 25». Для индекса 0, то есть родитель 7 и ребенка 22 | 25, что означает отдельные деревья, поэтому наш финал 7 22 и 7 25, и для последнего, мы имеем 7 10 и 7 22.

есть ли способ, что я мог сделать это итеративно? У меня уже есть синтаксические анализаторы, чтобы извлечь один уровень и извлечь, если есть числовой символ плюс амперсанд и извлечь дочерние уровни.

Большое вам спасибо.

ответ

1

Я думаю, что вы хотите здесь не итерации, но recursion.

Если предположить, что есть функция синтаксического анализа «синтаксический анализ», который может принимать строку и возвращает список потомков строк, это может выглядеть примерно так:

def parse_recursively(string): 
    if (string is dead end): # base case 
     return [string] 

    else: 
     children = parse(string) # returns a list of children strings 
     rv = list() 
     for s in children: 
      rv.extend(parse_recursively(s)) 

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