![]() | 1 xunyu 2013-07-15 10:34:31 +08:00 用递归函数? |
2 jander OP <http://twiki.org/cgi-bin/view/Blog/BlogEntry201109x3>提出了一种解决办法,不过是用Perl描述的,看不懂。 大致思路是: 1. 将字符串形式化,标注每个括号的层次。(这一步,没看懂原文怎么操作) '(1+(2+3)+4)+5' 形式化后: '$LEVEL1(1+$LEVEL2(+3$LEVEL2)+4$LEVEL1)+5 2. 然后就简单了, r'LEVEL1\([\s\S]+LEVEL1\)' 就可以匹配 '(1+(2+3)+4)'。 |
![]() | 3 caoyue 2013-07-15 11:50:40 +08:00 需要递归匹配和分组 \([^\\(\)]*(((?'k'\()[^\\(\)]*)+((?'-k'\))[^\\(\)]*)+)*(?(k)(?!))\) 之前的代码里面也用过 不要问我怎么弄出来的,我忘了…… |
![]() | &bsp; 4 picasso250 2013-07-15 12:47:04 +08:00 |
5 jander OP @picasso250 Python不支持:平衡组/递归匹配 |
![]() | 6 caoyue 2013-07-15 13:19:11 +08:00 |
7 jander OP |
![]() | 8 picasso250 2013-07-15 16:38:58 +08:00 @jander PCRE支持 (?R) ,python支持吗? 说句实在话,如果真是这么简单的需求,自己写,比正则简单。 extract string using /\(.+\)/ for each character in string { if( come across '(' ) level++ if( comeacross ')' ) level-- if( level == 0 ) print string if( string come to end ) exit } |
![]() | 9 rrfeng 2013-07-15 16:42:32 +08:00 复杂的正则其实会降低程序的运行速度…… 不如切分自己处理 或者你真的需要的是嵌套么?具体问题具体分析,可能根本不用嵌套 |
![]() | 10 Golevka 2013-07-15 19:21:37 +08:00 手撸一个top-down parser吧, 能直接构造出AST哦亲. expr : atom (+ atom)* atom : digit | '(' expr ')' |