擅长:python、mysql、java
<p>一种方法是对regex使用<code>findall</code>,该regex贪婪地匹配分隔符之间的内容。例如:</p>
<pre><code>>>> s = "Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
>>> r = re.compile(r'(?:[^,(]|\([^)]*\))+')
>>> r.findall(s)
['Wilbur Smith (Billy, son of John)', ' Eddie Murphy (John)', ' Elvis Presley', ' Jane Doe (Jane Doe)']
</code></pre>
<p>上面的正则表达式匹配一个或多个:</p>
<ul>
<li>非逗号、非开放paren字符</li>
<li>以开放paren开头的字符串,包含0个或多个非封闭paren,然后是封闭paren</li>
</ul>
<p>这种方法的一个怪癖是相邻的分离器被视为一个单独的分离器。也就是说,你不会看到空字符串。这可能是一个bug或特性,具体取决于您的用例。</p>
<p>还要注意,正则表达式<em>不</em>适合可能嵌套的情况。例如,这将不正确地拆分:</p>
<pre><code>"Wilbur Smith (son of John (Johnny, son of James), aka Billy), Eddie Murphy (John)"
</code></pre>
<p>如果您需要处理嵌套问题,最好的办法是将字符串划分为paren、逗号和其他所有内容(本质上是标记化它——这一部分仍然可以用正则表达式来完成),然后遍历那些重新组合字段的标记,在运行时跟踪嵌套级别(这种跟踪嵌套级别的方式是regex无法独立完成的)。</p>