如何在 python 中实现递归正则表达式?
- 2025-04-10 09:45:00
- admin 原创
- 15
问题描述:
我对如何在 Python 中实现递归正则表达式匹配很感兴趣(我没有找到任何示例:()。例如,如何编写与“括号平衡”字符串匹配的表达式,如“foo(bar(bar(foo)))(foo1)bar1”
解决方案 1:
你可以使用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']
解决方案 2:
你不能用正则表达式来实现这一点。Python 不支持递归正则表达式
解决方案 3:
使用 PyPi 正则表达式,你可以使用轻松安装pip install regex
,你可以使用
import regex
pattern = r'[^()]*+(((?>[^()]|(?1))*+)[^()]*+)++'
text = 'foo(bar(bar(foo)))(foo1)bar1'
print(bool(regex.fullmatch(pattern, text)))
# => True
参见Python 演示,参见正则表达式模式演示(请注意,演示中添加了A
和锚点,因为需要完整的字符串匹配)。z
`regex.fullmatch`
图案细节
A
- 隐含在regex.fullmatch
- 字符串的开头[^()]*+
- 0 个或更多除(
and之外的字符)
(所有格匹配,不允许回溯到模式)(((?>[^()]|(?1))*+)[^()]*+)++
- 第 1 组模式出现 1 次以上:
+ `(`- 一个`(`字符
+ `(?>[^()]|(?1))*+`- 1+ 次重复(所有格匹配)
- `[^()]`- 任何字符,`(`但`)`
- `|`- 或者
- `(?1)`- 递归第 1 组模式的正则表达式子程序
+ `)`- 一个`)`字符
+ `[^()]*+`- 0 个或多个除`(`and之外的字符`)`(所有格匹配)
z
— 隐含在regex.fullmatch
— 字符串末尾。
请参阅regular-expressions.info 上的正则表达式子程序的模式和更多信息。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD