1

在 Python 3.4 中,我尝试使用两种不同的正则表达式来匹配两种最里面的大括号,即不包含任何其他大括号的大括号。

正则表达式 1)匹配不在其他大括号或圆括号内的最里面的大括号,即下面的表达式

re.findall(r'...something...',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}") 

会返回这个

['{fff}','{kkk}']

目前我正在尝试使用以下表达式

re.findall(r'[^{(]*\{[^{}]+\}[^})]*',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")

不幸的是,它返回了这个:

['bbb{ccc}ddd', '}eee{fff}ggg(hhh{iii', '})jjj{kkk}']

正则表达式 2)匹配其他大括号或圆括号内的最里面的大括号,即以下表达式

re.findall(r'...something...',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}") 

会返回这个

['{ccc}','{iii}'] 

我正在尝试这个表达式:

 re.findall(r'[{(]*\{[^{}]+\}[})]*',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")

但它返回这个:

['{ccc}', '{fff}', '{iii})', '{kkk}']

关于如何修改这些正则表达式以获得正确匹配的任何想法?

4

2 回答 2

0

如果您想要一个匹配“不包含任何其他大括号的大括号”的单个正则表达式,请准确搜索 - 不包含其他大括号的大括号。

例如:

re.findall(r'{[^{}]+}',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}") 

这将返回两种情况的组合:

['{ccc}', '{fff}', '{iii}', '{kkk}']

如果您还想查找空括号(例如:),{}请将+*

于 2016-02-11T17:26:29.330 回答
0

对于第一种情况,您可以使用

{[^{}]*}(?![^{}()]*(?:[({][^{}()]*[)}])*[^(){}]*[})])

见演示。

https://regex101.com/r/aT3kG2/3

对于第二种情况,您可以使用

{[^{}]*}(?=[^{}()]*(?:[({][^{}()]*[)}])*[^(){}]*[})])

见演示。

https://regex101.com/r/aT3kG2/4

于 2016-02-11T17:23:49.793 回答