Python 如何使用regex lookback捕获括号之间的多个匹配

Python 如何使用regex lookback捕获括号之间的多个匹配,python,regex,Python,Regex,我试图捕捉以下示例中引号和括号之间的所有短语: body paragraph text (the "first phrase to capture" or the "second phrase to capture"). 因此,以下应该是匹配项:要捕获的第一个短语和要捕获的第二个短语。我试图使用下面的负lookbehind,但是我得到一个错误,lookbehinds必须是零宽度。有没有其他方法可以使用正则表达式实现这一点 (?<=\(.*)(".*?")(?=.*\)) 应该足够使用一

我试图捕捉以下示例中引号和括号之间的所有短语:

body paragraph text (the "first phrase to capture" or the "second phrase to capture").
因此,以下应该是匹配项:要捕获的第一个短语和要捕获的第二个短语。我试图使用下面的负lookbehind,但是我得到一个错误,lookbehinds必须是零宽度。有没有其他方法可以使用正则表达式实现这一点

(?<=\(.*)(".*?")(?=.*\))
应该足够使用一个。看看这是否符合您的要求:

"[^"(]*"(?=[^(]*\))
[^]*所需报价部分 ?=[^]*\lookahead检查是否在括号内 )


请注意,这在带引号的字符串(如@Sam commented)中的括号中失败。

PCRE为我们提供了很好的访问工具,如\G匹配最后一个匹配的结尾或字符串的开头,并\K放弃左侧匹配的项,从而使此操作可行:

(?:       (?# begin non-capturing-group)
  \(      (?# match start of the parenthesis)
 |        (?# OR)
  (?<!^)  (?# unless we are at the beginning of the string)
  \G      (?# start at the end of the last match)
)         (?# end non-capturing group)
[^)"]*    (?# match until end of the parenthesis or start of quote)
\K        (?# throw away everything to the left)
"([^"]*)" (?# capture 0+ characters inside double quotes)

引号内的括号失败,这可能适用于OP,在这种情况下,这将比我的更简单:testfoobaring@Sam没有看到任何指定的味道,所以用最简单的方法粘在一起,我想我看到PCRE的原因是什么,所以我的依赖于此。对于嵌套括号foo测试条fail,我的仍然不起作用。对于更简单的解决方案,使用+1。当1两个参数都在字符串中或2只有结束参数在字符串中时,这非常有效。我仍然有一些场景,结尾部分在下一行:与正文段落文本不匹配要捕获的第一个短语或要捕获的第二个短语然后换行…@rkp333它仅适用于平衡括号。可能需要预先检查字符串,如果有一个open而不是closing,例如\[^]*$并替换为\0请注意,嵌套括号将失败,因为大多数正则表达式引擎无法计数。我相信.NET有办法解决这一问题,以查看有多少括号已打开,以及它们是否都已关闭。这意味着foo测试条失败将失败,因为自上一个括号关闭后,没有打开任何括号。在我注意到没有指定任何味道之前,还对\G进行了实验:PYeah,对不起,我正在使用Python,因此看起来\G在那里不可用。作为未来问题的提示,指定要在中使用正则表达式的语言和/或将其添加为问号总是明智的。在大多数语言中,Regex的实现是不同的,有些东西根据其风格而无法工作。