1.关于Python正则表达式2019.02.21

Python正在升级regex模块。最新版本从2019年2月21日开始。您可以在这里查阅:
https://pypi.org/project/regex/

它将及时替换re模块。目前,您需要使用pip install regex手动安装它,并导入regex模块而不是re



2.新的正则表达式功能

关于最新版本的最酷的功能是递归模式。在此处了解更多信息:https://bitbucket.org/mrabarnett/mrab-regex/issues/27

此功能使您可以找到匹配的paretheses ( .. )或大括号{ .. }。以下网页说明了如何执行此操作:https://www.regular-expressions.info/recurse.html#balanced
我引用:


  递归的主要目的是匹配平衡构造或嵌套构造。通用正则表达式是b(?:m|(?R))*e,其中b是开始构造的地方,m是可能在构造中间出现的内容,而e是可能在构造结尾出现的内容。为了获得正确的结果,bme中的任何两个都不能匹配相同的文本。您可以使用原子组而不是非捕获组来提高性能:b(?>m|(?R))*e
  
  
  现实世界中常见的用法是匹配一组平衡的括号。 \((?>[^()]|(?R))*\)将一对括号与之间的任何文本匹配,包括无限数量的括号,只要它们都正确配对即可。




3.我的问题

我正在尝试使用匹配的大括号{ .. }。因此,我只是在上面的网页中应用了正则表达式,但是我将(替换为{。这给了我以下正则表达式:

{(?>[^{}]|(?R))*}

我在https://regex101.com上尝试并获得漂亮的结果(*):

python - Python正则表达式:最新版本中的匹配括号(2019年2月)-LMLPHP

我想更进一步,找到一组特定的匹配花括号,如下所示:

MEMORY\s*{(?>[^{}]|(?R))*}

结果很棒:

python - Python正则表达式:最新版本中的匹配括号(2019年2月)-LMLPHP

但是当我尝试

SECTIONS\s*{(?>[^{}]|(?R))*}

一无所获。没有匹配。 MEMORY{..}SECTIONS{..}部分之间的唯一区别是,后者有一些嵌套的花括号。因此,应该在此处找到问题。但是我不知道该如何解决。



*注1:
https://regex101.com上,您可以选择正则表达式的样式。通常我选择Python,但是这次我选择PCRE(PHP),因为regex101网站尚未应用最新的Python regexes升级。

为了确认结果,我还在终端中的一个简单的python会话中尝试使用以下命令:
import regex
p = regex.compile(r"...")
text = """ ... """
p.findall(text)


* 笔记2:
我用于测试的文本是:


MEMORY
{
    /* Foobar */
    consectetur adipiscing elit,
    sed do eiusmod tempor incididunt
}
Lorem ipsum dolor sit amet,

SECTIONS
{
    ut labore et dolore magna aliqua.
    /* Foobar */
        FOO
        {
            /* Foobar */
            Ut enim ad minim veniam,
            quis nostrud exercitation ullamco
        }

        BAR
        {
            /* Foobar */
            laboris nisi
            ut
        }
    aliquip ex ea commodo consequat.
}
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

最佳答案

您只需要递归(?R)子模式,便可以使用{...}构造递归整个模式。用捕获组将其包装,然后用subroutine对其进行递归:

p = regex.compile(r"SECTIONS\s*({(?>[^{}]|(?1))*})")
for m in p.finditer(text):
    print(m.group())


请参见Python regex demo online

请注意,第一个模式也有同样的问题,如果在其中添加嵌套的花括号,它将无法正常工作。将其修复为MEMORY\s*({(?>[^{}]|(?1))*})

关于python - Python正则表达式:最新版本中的匹配括号(2019年2月),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55045991/

10-16 22:51