<p>您需要匹配<code>(</code>和<code>)(</code>之间的字符串,或者<code>)(</code>和<code>)</code>之间的字符串。这样就避免了在<code>'(di(rect)or.n)'</code>中匹配像<code>'(rect)'</code>这样的字符串。您可以通过使用<a href="https://docs.python.org/3/library/re.html#lookahead%20assertion" rel="nofollow">lookaround assertions</a>来实现这一点,因为它们不使用所搜索的字符串</p>
<p><strong>前瞻性断言</strong>:</p>
<blockquote>
<p><code>(?=...)</code>
Matches if <code>...</code> matches next, but doesn’t consume any of the string.
This is called a lookahead assertion. For example, <code>Isaac (?=Asimov)</code> will match <code>'Isaac '</code> only if it’s followed by <code>'Asimov'</code>.</p>
</blockquote>
<p><strong>积极的回顾断言</strong>:</p>
<blockquote>
<p><code>(?<=...)</code>
Matches if the current position in the string is preceded by a match for ... that ends at the current position. This is called a
positive lookbehind assertion. <code>(?<=abc)def</code> will find a match in
<code>abcdef</code>, since the lookbehind will back up 3 characters and check if
the contained pattern matches.</p>
</blockquote>
<p>在下面的代码中,我使用<code>re.VERBOSE</code>标志使其更具可读性</p>
<pre><code>pattern = re.compile(r"""
(?<= \( ) .+? (?= \)\( ) # Matches string after a '(' and before a ')('
| # or...
(?<= \)\( ) .+? (?= \) ) # Matches string after a ')(' and before a ')'
""", re.VERBOSE)
print (re.findall(pattern, temp2))
</code></pre>