有一个形如:'(1+(2+3)+4)+5'的字符串,
正则表达式:r'\([^\)]+\)',只能匹配'(1+(2+3)',
如何解决嵌套问题,匹配'(1+(2+3)+4)'。
正则表达式:r'\([^\)]+\)',只能匹配'(1+(2+3)',
如何解决嵌套问题,匹配'(1+(2+3)+4)'。
|
xunyuJul 15, 2013
1
用递归函数?
|
|
2
<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)'。 |
|
caoyueJul 15, 2013
3
需要递归匹配和分组
\([^\\(\)]*(((?'k'\()[^\\(\)]*)+((?'-k'\))[^\\(\)]*)+)*(?(k)(?!))\) 之前的代码里面也用过 不要问我怎么弄出来的,我忘了…… |
|
picasso250Jul 15, 2013
4
|
|
5
@picasso250 Python不支持:平衡组/递归匹配
|
|
caoyueJul 15, 2013
6
|
|
7
|
|
picasso250Jul 15, 2013
8
@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 } |
|
rrfengJul 15, 2013
9
复杂的正则其实会降低程序的运行速度……
不如切分自己处理 或者你真的需要的是嵌套么?具体问题具体分析,可能根本不用嵌套 |
|
GolevkaJul 15, 2013
10
手撸一个top-down parser吧, 能直接构造出AST哦亲.
expr : atom (+ atom)* atom : digit | '(' expr ')' |