[英]How can a recursive regexp be implemented in python?
我對如何在 Python 中實現遞歸正則表達式匹配很感興趣(我沒有找到任何示例 :( )。例如,如何編寫匹配“括號平衡”字符串的表達式,如“foo(bar(bar(foo))” )(foo1)bar1"
你可以使用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']
你不能用正則表達式來做到這一點。 Python 不支持遞歸正則表達式
不幸的是,我認為 Python 的正則表達式不支持遞歸模式。
你可以用類似 pyparsing 的東西來解析它: https : //github.com/pyparsing/pyparsing
使用 PyPi regex,您可以使用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 個或更多字符(占有匹配,不允許回溯到模式中)(\\((?>[^()]|(?1))*+\\)[^()]*+)++
- 第 1 組模式出現 1+ 次:
\\(
- a (
字符(?>[^()]|(?1))*+
- 1+ 次重復(占有匹配)
[^()]
- 除了(
和)
任何字符|
- 要么(?1)
- 遞歸第 1 組模式的正則表達式子例程\\)
- a )
字符[^()]*+
- 除(
和)
之外的 0 個或更多字符(占有匹配)\\z
- 在regex.fullmatch
隱含 - 字符串的結尾。在regular-expressions.info 中查看有關regex 子例程的模式和更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.