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)(?!))\) 之前的代码里面也用过 不要问我怎么弄出来的,我忘了…… |
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 ')' |