<p>一个想法,用<a href="https://www.rexegg.com/regex-recursion.html" rel="nofollow noreferrer">recursive pattern</a>和<a href="https://pypi.org/project/regex/" rel="nofollow noreferrer">PyPI regex module</a>一起使用。在</p>
<pre><code>\b[A-Za-z]+\s+(?R)?\(?[A-Z](?=[A-Z]*\))\)?
</code></pre>
<p><a href="https://regex101.com/r/glXhac/1" rel="nofollow noreferrer">See this pcre demo at regex101</a></p>
<ul>
<li><code>\b[A-Za-z]+\s+</code>匹配<a href="https://www.regular-expressions.info/wordboundaries.html" rel="nofollow noreferrer">word boundary</a>,<a href="https://www.rexegg.com/regex-quickstart.html#quantifiers" rel="nofollow noreferrer">one or more</a>alpha,一个或多个<em>空白</em></li>
<li><code>(?R)?</code>递归部分:<a href="https://www.regular-expressions.info/optional.html" rel="nofollow noreferrer">optionally</a>从头开始粘贴模式</li>
<li><code>\(?</code>需要使括号成为可选的,以便递归适合<code>\)?</code></li>
<li><code>[A-Z](?=[A-Z]*\)</code>将一个大写字母<a href="https://www.regular-expressions.info/lookaround.html" rel="nofollow noreferrer">if followed by</a>结束<code>)</code>与中间的任何A-Z匹配</li>
</ul>
<ol>
<li>不检查第一个单词字母是否与缩写中位置的字母匹配。在</li>
<li>不检查缩写前面的左括号。要进行检查,请添加可变长度的lookbehind。将<code>[A-Z](?=[A-Z]*\))</code>更改为<a href="http://regexstorm.net/tester?p=%28%3F%3C%3D%5C%28%5BA-Z%5D*%29%5BA-Z%5D%28%3F%3D%5BA-Z%5D*%5C%29%29&i=ABC%0D%0A%28ABC%29%0D%0AABC%29%0D%0A%28ABC" rel="nofollow noreferrer">^{<cd8>}</a>。在</li>
</ol>