我很感兴趣如何在Python中实现递归正则表达式匹配(我没有找到任何例子 :()。例如,如何编写一个表达式来匹配像"foo(bar(bar(foo)))(foo1)bar1"这样的“括号平衡”的字符串。
#!/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']
这是一个老问题,但是对于通过搜索来到这里的人:
有一种Python的替代正则表达式模块支持递归模式: https://pypi.python.org/pypi/regex
它在re
上还有很多更好的改进。
您无法使用正则表达式完成此操作。Python不支持递归正则表达式。
pip install regex
命令即可。接下来,你可以使用它进行相关操作。import regex
pattern = r'[^()]*+(\((?>[^()]|(?1))*+\)[^()]*+)++'
text = 'foo(bar(bar(foo)))(foo1)bar1'
print(bool(regex.fullmatch(pattern, text)))
# => True
\A
和\z
锚点,因为regex.fullmatch
需要完全匹配字符串)。
模式细节
\A
- 在regex.fullmatch
中隐含 - 字符串的开头[^()]*+
- 0个或多个字符,不包括(
和)
(占有匹配,不允许回溯到模式中)(\((?>[^()]|(?1))*+\)[^()]*+)++
- 1个或多个出现的第1组模式:
\(
- (
字符(?>[^()]|(?1))*+
- 1个或多个重复(占有匹配)的
[^()]
- 除(
和)
之外的任何字符|
- 或(?1)
- 递归第1组模式的正则表达式子程序\)
- )
字符[^()]*+
- 0个或多个字符,不包括(
和)
(占有匹配)\z
- 在regex.fullmatch
中隐含 - 字符串的结尾。