擅长:python、mysql、java
<p>{a1在Python中可以用一个更短的^ I来代替它:</p>
<pre><code>>>> import regex
>>> r = regex.compile(r'({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)|\s*,\s*')
>>> s = """{J. Doe, R. Starr}, {Lorem
{i}psum dolor }, Dol. sit., am. et."""
>>> print(r.split(s))
['{J. Doe, R. Starr}', None, '{Lorem\n{i}psum dolor }', None, 'Dol. sit.', None, 'am. et.']
</code></pre>
<p>模式<code>({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)</code>-匹配<code>{...{...{}...}...}</code>类结构(如<code>{</code>匹配<code>{</code>,<code>(?:[^{}]++|\g<1>)*</code>匹配2个备选方案的0+次出现:1)除<code>{</code>和<code>}</code>(The <code>[^{}]++</code>)之外的任何1+字符,2)匹配整个<code>({(?:[^{}]++|\g<1>)*})</code>子模式的文本)。<code>(*SKIP)(*FAIL)</code>动词使引擎忽略匹配缓冲区中的全部匹配值,因此,将索引移动到匹配的末尾,并且不保留任何要返回的内容(我们“跳过”匹配的内容)。在</p>
<p><code>\s*,\s*</code>匹配用0+空格括起来的逗号。在</p>
<p>出现<code>None</code>值是因为第一个分支中有一个捕捉组,当第二个分支匹配时该组为空。我们需要在第一个可选分支中使用一个捕获组来进行递归。要删除空元素,请使用“理解”:</p>
^{pr2}$