如何使用正则表达式回溯捕获括号之间的多个匹配项

时间:2014-09-23 00:08:07

标签: python regex

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

body paragraph text (the "first phrase to capture" or the "second phrase to capture").

所以以下内容应该是匹配:"first phrase to capture""second phrase to capture"。我尝试使用负面的lookbehind如下,但我得到一个错误,说lookbehinds需要是零宽度。有没有其他方法可以使用正则表达式来实现它?

(?<=\(.*)(".*?")(?=.*\))

Link to example.

2 个答案:

答案 0 :(得分:2)

应该足以使用lookahead。看看这是否符合您的要求:

"[^"(]*"(?=[^(]*\))
  • "[^"(]*"所需的引用部分
  • (?=[^(]*\))预测检查是否在括号内

Example at regex101; Regex FAQ

请注意,在@Sam评论的引用字符串中的括号内会失败。

答案 1 :(得分:2)

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)

Demo