首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的正则表达式,用于从带有嵌套偏误的字符串中提取字符

简单的正则表达式,用于从带有嵌套偏误的字符串中提取字符
EN

Stack Overflow用户
提问于 2012-12-15 10:26:41
回答 3查看 117关注 0票数 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)

有没有一种方法可以按层次顺序提取变量和函数名?假设我想打印它们,如下所示,

代码语言:javascript
运行
复制
a
 b
 c
  d
  e
   f
   g
  h
   i 

如何使用Python的解析器轻松完成此操作?我应该使用什么正则表达式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-15 10:57:26

正则表达式不适合嵌套结构。但是字符串操作并不是什么大问题:

代码语言:javascript
运行
复制
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)

打印:

代码语言:javascript
运行
复制
a
 b
 c
  d
  e
   f
   g
  h
   i
票数 4
EN

Stack Overflow用户

发布于 2012-12-15 12:51:17

代码语言:javascript
运行
复制
>>> 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
票数 1
EN

Stack Overflow用户

发布于 2012-12-15 12:48:31

将问题分解为两个步骤: 1.解析数据2.打印数据

解析数据的最好方法是找到一个已经存在的解析器。如果你对格式有发言权,选择一个已经设计好的格式:不要自己设计。如果您对格式没有发言权,并且被迫编写自己的解析器,请听从Ned的建议,不要使用regex。它只会在泪水中结束。

解析完数据后,使用pprint模块将其打印出来。它擅长打印供人类消费的东西!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13888752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档