Python正则表达式匹配括号,但不是嵌套的括号

时间:2015-08-04 20:13:22

标签: python regex string parentheses

是否可以匹配像()这样的括号但不允许嵌套?换句话说,我希望我的正则表达式匹配()而不是(()) 我正在尝试的正则表达式是

\(\[^\(\)])

但它似乎没有用。有人可以向我解释我做错了吗?

1 个答案:

答案 0 :(得分:2)

如果(foo)中的x(foo)x匹配,但(foo)中的((foo))不匹配,则正则表达式无法满足您的要求,因为正则表达式代表常规语法和all regular grammars are context free。但上下文(或“州”,Jonathon Reinhart called it in his comment)对于区分(foo)x(foo)x中的((foo))子字符串是必要的。

如果您只想匹配由带括号的子字符串组成的字符串,而在该子字符串中没有任何括号(匹配或不匹配),则以下正则表达式将执行:

^\([^()]*\)$
  • ^$分别将模式粘贴到字符串的开头和结尾,从而排除部分匹配
  • 注意括号内非括号字符的任意重复次数(... *)。
  • 请注意特殊字符如何不在里面字符集中转义,但仍具有字面含义。 (在那里放入反斜杠会在字符集中放入文字反斜杠。或者在这种情况下,由于否定而在字符集之外。)
  • 请注意[如何启动字符集不会被转义,因为我们实际上想要它的特殊含义,而不是字面含义

最后两点可能特定于Python使用的正则表达式的方言。

因此,这将完全匹配()(foo),但不会(甚至不是部分地)匹配(foo)bar)(foo(bar)x(foo)(foo)x()()