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 のパーサーを使用してこれを簡単に行うにはどうすればよいですか? どの正規表現を使用すればよいですか?
正規表現は、ネストされた構造には適していません。しかし、文字列操作は大したことである必要はありません:
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
>>> 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
問題を2つのステップに分けます:1。データを解析します2.データを印刷します
データを解析する最良の方法は、すでに存在するパーサーを見つけることです。この形式で発言権がある場合は、すでに考案されている発言を選択してください。自分で発言しないでください。形式に発言権がなく、独自のパーサーを作成する必要がある場合は、Nedのアドバイスに注意し、正規表現を使用しないでください。それは涙で終わるだけです。
データを解析したら、pprintモジュールを使用してデータを印刷します。人間が消費するものを印刷するのに優れています!