+ -
当前位置:首页 → 问答吧 → python正则表达式如何对括号进行成对匹配?

python正则表达式如何对括号进行成对匹配?

时间:2011-07-21

来源:互联网



QUOTE:
有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?



在.Net Framework的正则表达式中,提供了”平衡组/递归匹配“的处理方法(见《正则表达式30分钟入门教程》)。

在python中,又有什么方法较好的实现这种匹配呢?

作者: y_square   发布时间: 2011-07-21

python 暂不支持动态正则表达式,所以要实现嵌套结构匹配只能自己来实现了。
  1. import re
  2. pattern_0 = r'\([^()]*\)'      #depth 0 pattern
  3. pat_left = r'\((?:[^()]|'   
  4. pat_right = r')*\)'
  5. def pattern_generate(pattern, depth=0):
  6.     while(depth):
  7.         pattern = pat_left + pattern + pat_right
  8.         depth -= 1
  9.     return pattern

  10. def main():
  11.     data = r'test(1+2*(2-1)-3*(5+2)+10+(()))'
  12.     pat = pattern_generate(pattern_0, 2)
  13.     print('Pattern:', pat)
  14.     prog = re.compile(pat)
  15.     result = prog.search(data)
  16.     if result:
  17.         print('Find: {}'.format(result.group(0)))
  18.     else:
  19.         print('Can\'t match')

  20. if __name__ == '__main__':
  21.     main()
复制代码
表达式未进行任何优化,需要的话自己来搞吧~

作者: ccporxy   发布时间: 2011-07-22