0

a(b,c(d,e(f,g),h(i))) のような句と、a(b,c(d,e (f,g),h(i))),a(b,c(d,e(f,g),h(i)))

変数名と関数名を階層順に抽出する方法はありますか? 次のように印刷したいとします。

a
 b
 c
  d
  e
   f
   g
  h
   i 

Python のパーサーを使用してこれを簡単に行うにはどうすればよいですか? どの正規表現を使用すればよいですか?

4

3 に答える 3

4

正規表現は、ネストされた構造には適していません。しかし、文字列操作は大したことである必要はありません:

s = "a(b,c(d,e(f,g),h(i)))"

import re

level = 0
for tok in re.finditer(r"\w+|[()]", s):
    tok = tok.group()
    if tok == "(":
        level += 1
    elif tok == ")":
        level -= 1
    else:
        print "%s%s" % (" "*level, tok)

プリント:

a
 b
 c
  d
  e
   f
   g
  h
   i
于 2012-12-15T02:57:25.903 に答える
1
>>> s = "a(b,c(d,e(f,g),h(i))),a(b,c(d,e(f,g),h(i)))"
>>> from pyparsing import nestedExpr,Word,alphas,Literal
>>> result = nestedExpr(content=Word(alphas)).ignore(Literal(',')).parseString('('+s+')')
>>> print(results.asList())
[['a', ['b', 'c', ['d', 'e', ['f', 'g'], 'h', ['i']]], 'a', ['b', 'c', ['d', 'e', ['f', 'g'], 'h', ['i']]]]]
>>> def dump(lst,indent=''):
...   for i in lst:
...      if isinstance(i,list):
...        dump(i,indent+' ')
...      else:
...        print (indent,i)
...
>>> dump(result.asList())
  a
   b
   c
    d
    e
     f
     g
    h
     i
  a
   b
   c
    d
    e
     f
     g
    h
     i
于 2012-12-15T04:51:17.080 に答える
0

問題を2つのステップに分けます:1。データを解析します2.データを印刷します

データを解析する最良の方法は、すでに存在するパーサーを見つけることです。この形式で発言権がある場合は、すでに考案されている発言を選択してください。自分で発言しないでください。形式に発言権がなく、独自のパーサーを作成する必要がある場合は、Nedのアドバイスに注意し、正規表現を使用しないでください。それは涙で終わるだけです。

データを解析したら、pprintモジュールを使用してデータを印刷します。人間が消費するものを印刷するのに優れています!

于 2012-12-15T04:48:30.837 に答える