用于从带有嵌套括号的字符串中提取字符的简单正则表达式

时间:2012-12-15 02:26:41

标签: python regex

我的条款如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的解析器? 我应该使用什么样的正则表达式?

3 个答案:

答案 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模块将其打印出来。它擅长印刷用于人类消费的东西!