【问题标题】:Python 3.4 - Regular Expressions - Matching Innermost curly brackets within & not within other bracketsPython 3.4 - 正则表达式 - 匹配最内层的大括号内和不在其他括号内
【发布时间】:2016-05-22 14:46:36
【问题描述】:

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

知道如何修改这些正则表达式以获得正确的匹配吗?

【问题讨论】:

  • 您真的需要两个表达式,还是只需要一个匹配“不包含任何其他大括号的大括号”的表达式?
  • 另外,是否要求您使用正则表达式,或者其他解决方案是否有效?你可以很容易地遍历字符并计算花括号。

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


【解决方案1】:

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

例如:

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

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

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

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

【讨论】:

  • 实际上,我正在寻找的是:案例1)不包含其他括号并且它们本身不在大括号或括号内的大括号;情况 2) 不包含其他括号的大括号,并且它们本身位于大括号或圆括号内。 :-)
  • @phodor:不清楚您是否需要两个表达式,或者一个返回两种情况组合的表达式。您能否在问题中澄清您是否特别需要两个单独的表达式?
  • @phodor:现在还不清楚。您声明您需要找到“不包含任何其他大括号的大括号”的所有匹配项。然后您说您尝试了两个单独的表达式,但您没有说明您是否需要两个单独的表达式。一个表达式不起作用是有原因的吗?
【解决方案2】:

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

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

查看演示。

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

第二种情况你可以使用

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

查看演示。

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

【讨论】:

  • 您的第一个失败是您在同一个外大括号中有两组大括号。例如{aaa{bbb}ccc{ddd}eee} 将返回{bbb}
猜你喜欢
  • 2016-05-21
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多