嵌套的正则表达式,求解

2013-07-15 10:27:51 +08:00
 jander
有一个形如:'(1+(2+3)+4)+5'的字符串,
正则表达式:r'\([^\)]+\)',只能匹配'(1+(2+3)',
如何解决嵌套问题,匹配'(1+(2+3)+4)'。
4032 次点击
所在节点    Python
10 条回复
xunyu
2013-07-15 10:34:31 +08:00
用递归函数?
jander
2013-07-15 11:12:06 +08:00
<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)'。
caoyue
2013-07-15 11:50:40 +08:00
需要递归匹配和分组
\([^\\(\)]*(((?'k'\()[^\\(\)]*)+((?'-k'\))[^\\(\)]*)+)*(?(k)(?!))\)
之前的代码里面也用过

不要问我怎么弄出来的,我忘了……
picasso250
2013-07-15 12:47:04 +08:00
jander
2013-07-15 12:58:47 +08:00
@picasso250 Python不支持:平衡组/递归匹配
caoyue
2013-07-15 13:19:11 +08:00
@jander 没注意节点……
可以试试 pyparsing
http://pyparsing.wikispaces.com/
jander
2013-07-15 14:29:41 +08:00
解决了形式化的问题:

http://gist.github.com/anonymous/5997860
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 }
rrfeng
2013-07-15 16:42:32 +08:00
复杂的正则其实会降低程序的运行速度……
不如切分自己处理

或者你真的需要的是嵌套么?具体问题具体分析,可能根本不用嵌套
Golevka
2013-07-15 19:21:37 +08:00
手撸一个top-down parser吧, 能直接构造出AST哦亲.

expr : atom (+ atom)*
atom : digit | '(' expr ')'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/75794

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX