我的条款如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的解析器? 我应该使用什么样的正则表达式?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
将问题分解为两个步骤: 1.解析数据 2.打印数据
解析数据的最佳方法是找到已存在的解析器。如果您对格式有发言权,请选择已经设计过的:不要自己制作。如果你没有格式化的说法,并被迫编写自己的解析器,请注意Ned的建议,不要使用正则表达式。它只会以泪水结束。
解析数据后,使用pprint模块将其打印出来。它擅长印刷用于人类消费的东西!