<p>正则表达式模式:<code>(,)|(\([^()]{0,20}\))</code></p>
<p>这种模式背后的直觉:</p>
<ul>
<li><p><code>(,)</code>查找所有逗号。这些存储在捕获组1中</p>
</li>
<li><p><code>(\([^()]{0,20}\))</code>查找中间最多20个字符的所有括号。这些存储在捕获组2中</p>
</li>
</ul>
<p>然后,我们可以找到组1中的所有匹配项,只排除长度为20的括号内的逗号</p>
<p>现在要查找这些匹配项的索引,请使用<a href="https://docs.python.org/3/library/re.html#re.finditer" rel="nofollow noreferrer">re.finditer()</a>与<a href="https://docs.python.org/3/library/re.html#re.Match.start" rel="nofollow noreferrer">Match.start()</a>和<a href="https://docs.python.org/3/library/re.html#re.Match.group" rel="nofollow noreferrer">Match.group()</a>组合使用,以查找组1中每个匹配项的起始索引:</p>
<pre><code>import re
string = """Get index of this comma, but (not this , comma). Get other commas like , or ,or, 1,1 2 ,2.
(not this ,) BUT (get index of this comma, if more than 20 characters are inside the parentheses)"""
indices = [m.start(1) for m in re.finditer('(,)|(\([^()]{0,20}\))', string) if m.group(1)]
print(indices)
# > [23, 71, 76, 79, 82, 87, 132]
print([string[index] for index in indices])
# > [',', ',', ',', ',', ',', ',', ',']
</code></pre>
<p><code>m.start(1)</code>返回组1匹配的起始索引。由于<code>re.finditer()</code>返回来自所有捕获组的匹配项,因此添加<code>if m.group(1)</code>需要为组1找到匹配项(来自其他组的匹配项为<code>None</code>)</p>
<p>编辑:这将忽略内部包含20个或更少字符的括号,这与第一条语句不一致,但与示例中解释的内容一致。如果希望<em>小于</em>20,只需使用<code>{0,19}</code></p>