<p>使用PyPi正则表达式:</p>
<pre class="lang-py prettyprint-override"><code>,(?![^()]*\))|(?<=\((?=[^()]{20})[^()]*),
</code></pre>
<p>见<a href="https://regex101.com/r/Vk0vyE/1" rel="nofollow noreferrer">proof</a></p>
<p><a href="https://tio.run/##nZIxT8MwEIX3/IqjDLHRKSSpgA5pK2BgqlhgagtKU6exIHZku1IQ8NvDpSkSNOoAw0n2Z7@z7j1Xb67Qatg0sqy0cWDERtSeE7WDMZjBnXAg1VrUoHNwhbSQ6bJMEVZbB0xp10HsMA@gFWhXCNMRC6/yRSBoA6gNQoQRxIBx8FPM4ebxAdjm2Fsyh1IbQSxVEIeQFalJMyeMhZSwVFau21MBFe0VLaywfODRLM@iroywVmrVzuMjm57Mnxhfni04/2DTZLxgbDreofc4/OTdIUffq4xUju38COx2xX53Q/CT2/vZ7Hqy2CThJDnvNj5C6x3n3ikc8W4vw2/J36zsqcnZQ6ZN71Z0SNoYDtlfUum98L@QPGotM2EpnDnZ7FLjGIechqpJ0v3GIG8vUadeBDurl/uk9p1a5@fxEOEqpLqgGiGMIqpL@n7DaNk0Xw" rel="nofollow noreferrer"><strong>Python code</strong></a>:</p>
<pre class="lang-py prettyprint-override"><code>import regex
text = r"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)"
reg_expression = r',(?![^()]*\))|(?<=\((?=[^()]{20})[^()]*),'
print(regex.sub(reg_expression, '<COMMA>\g<0></COMMA>', text))
# Get index of this comma<COMMA>,</COMMA> but (not this , comma). Get other commas like<COMMA>,</COMMA> or <COMMA>,</COMMA>or<COMMA>,</COMMA> 1<COMMA>,</COMMA>1 2 <COMMA>,</COMMA>2. (not this ,) BUT (get index of this comma<COMMA>,</COMMA> if more than 20 characters are inside the parentheses)
indices = [x.start() for x in regex.finditer(reg_expression, text)]
print(indices)
# [23, 70, 75, 78, 81, 86, 131]
</code></pre>
<p><strong>表达解释</strong></p>
<pre><code>--------------------------------------------------------------------------------
, ','
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
[^()]* any character except: '(', ')' (0 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
\) ')'
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
| OR
--------------------------------------------------------------------------------
(?<= look behind to see if there is:
--------------------------------------------------------------------------------
\( '('
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
[^()]{20} any character except: '(', ')' (20
times)
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
[^()]* any character except: '(', ')' (0 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
) end of look-behind
--------------------------------------------------------------------------------
, ','
</code></pre>