簡體   English   中英

如何在python中實現遞歸正則表達式?

[英]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']

這是一個老問題,但對於通過搜索來到這里的人來說:

有一個支持遞歸模式的替代正則表達式模塊: https : //pypi.python.org/pypi/regex

它對re有很多更好的改進。

你不能用正則表達式來做到這一點。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM