Python 3.4 - 正则表达式 - 匹配&内的最内侧花括号不在其他括号内

时间:2016-02-11 17:18:09

标签: regex python-3.x brackets parentheses curly-brackets

在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}']

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

2 个答案:

答案 0 :(得分:0)

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

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

参见演示。

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

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

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

参见演示。

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

答案 1 :(得分:0)

如果你想要一个匹配"大括号但不包含任何其他大括号"的单个正则表达式,请搜索那些 - 不包含其他大括号的大括号。

例如:

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

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

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

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