gpt4 book ai didi

Python 正则表达式 : matching parentheses in newest version (Feb 2019)

转载 作者:行者123 更新时间:2023-12-01 08:14:54 24 4
gpt4 key购买 nike

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

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

The main purpose of recursion is to match balanced constructs or nested constructs. The generic regex is b(?:m|(?R))*e where b is what begins the construct, m is what can occur in the middle of the construct, and e is what can occur at the end of the construct. For correct results, no two of b, m, and e should be able to match the same text. You can use an atomic group instead of the non-capturing group for improved performance: b(?>m|(?R))*e.  
 
A common real-world use is to match a balanced set of parentheses. \((?>[^()]|(?R))*\) matches a single pair of parentheses with any text in between, including an unlimited number of parentheses, as long as they are all properly paired.

 

3。我的问题

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

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

我试了一下https://regex101.com并获得漂亮的结果(*):

enter image description here

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

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

结果很棒:

enter image description here

但是当我尝试

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

什么也没找到。没有匹配。 MEMORY{..}SECTIONS{..} 部分之间的唯一区别是后者有一些嵌套的大括号。所以问题应该就在那里找到。但我不知道如何解决这个问题。

<小时/>

* 注 1:
https://regex101.com ,您可以选择正则表达式的风格。通常我选择Python,但这次我选择PCRE(PHP),因为regex101网站还没有应用最新的Python正则表达式升级。
为了确认结果,我还在终端的简单 python session 中进行了尝试,命令如下:
导入正则表达式
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 正则表达式 : matching parentheses in newest version (Feb 2019),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55045991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com