我有像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的解析器轻松完成此操作?我应该使用什么正则表达式?
发布于 2012-12-15 10:57:26
正则表达式不适合嵌套结构。但是字符串操作并不是什么大问题:
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-15 12:51:17
>>> 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-15 12:48:31
将问题分解为两个步骤: 1.解析数据2.打印数据
解析数据的最好方法是找到一个已经存在的解析器。如果你对格式有发言权,选择一个已经设计好的格式:不要自己设计。如果您对格式没有发言权,并且被迫编写自己的解析器,请听从Ned的建议,不要使用regex。它只会在泪水中结束。
解析完数据后,使用pprint模块将其打印出来。它擅长打印供人类消费的东西!
https://stackoverflow.com/questions/13888752
复制相似问题