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