如何在python中实现递归正则表达式?

时间:2009-11-01 10:48:38

标签: python regex recursion

我很感兴趣如何在Python中实现递归正则表达式匹配(我没有找到任何示例:()。例如,如何编写匹配“括号平衡”字符串的表达式,如“foo”(bar(bar( FOO)))(foo1)BAR1"

5 个答案:

答案 0 :(得分:15)

您可以使用pyparsing

#!/usr/bin/env python
from pyparsing import nestedExpr
import sys
astring=sys.argv[1]
if not astring.startswith('('):
    astring='('+astring+')'

expr = nestedExpr('(', ')')
result=expr.parseString(astring).asList()[0]
print(result)

运行它会产生:

% test.py "foo(bar(bar(foo)))(foo1)bar1"
['foo', ['bar', ['bar', ['foo']]], ['foo1'], 'bar1']

答案 1 :(得分:11)

这是一个老问题,但对于通过搜索来到这里的人来说:

python的另一个正则表达式模块支持递归模式: https://pypi.python.org/pypi/regex

它在re上有很多改进。

答案 2 :(得分:4)

你不能用正则表达式做到这一点。 Python不支持递归regexp

答案 3 :(得分:3)

不幸的是,我不认为Python的正则表达式支持递归模式。

你可以用pyparsing:http://pyparsing.wikispaces.com/

之类的东西来解析它

答案 4 :(得分:0)

使用PyPi正则表达式,您可以使用pip install regex轻松安装,也可以使用

import regex

pattern = r'[^()]*+(\((?>[^()]|(?1))*+\)[^()]*+)++'
text = 'foo(bar(bar(foo)))(foo1)bar1'
print(bool(regex.fullmatch(pattern, text)))
# => True

请参见Python demo,请参见regex pattern demo(请注意,演示中添加了\A\z锚,因为regex.fullmatch需要完整的字符串匹配)

模式详细信息

  • \A-隐含在regex.fullmatch中-字符串的开头
  • [^()]*+-除()以外的0个或更多字符(强制匹配,不允许回溯到模式中)
  • (\((?>[^()]|(?1))*+\)[^()]*+)++-1组以上的出现1次:
    • \(-一个(字符
    • (?>[^()]|(?1))*+-超过1次重复(强制匹配)
      • [^()]-除()
      • 外的任何字符
      • |-或
      • (?1)-递归第1组模式的regex子例程
    • \)-一个)字符
    • [^()]*+-除()以外的0个或更多字符(强制匹配)
  • \z-隐含在regex.fullmatch中-字符串结尾。

请参见regular-expressions.info上的pattern and more information on regex subroutines