<p>假设你的方括号可以嵌套,你所拥有的并不是一种常规语言。虽然<code>re</code>确实有很多扩展,使它能够处理实际正则表达式之外的事情,但最好使用一个简单的括号计数解析器来处理这一问题。在</p>
<p>如下所示(未经测试,但应足够简单,以便理解和调试):</p>
<pre><code>bracketmap = {'(': ')', '[': ']', '{': '}'}
def splitify(s):
stack = []
lastcomma = 0
for i, c in enumerate(s):
if not stack and c == ',':
yield s[lastcomma:i]
lastcomma = i+1
elif c in bracketmap:
stack.append(bracketmap[c])
elif c in ')]}':
if stack.pop() != c:
raise ValueError('unbalanced brackets')
if stack:
raise ValueError('unbalanced brackets')
if lastcomma <= len(s):
yield s[lastcomma:]
</code></pre>
<hr/>
<p>在一篇评论中,当被问及你的方括号是否可以嵌套时,你说:</p>
<blockquote>
<p>it can be if it appears to be a valid regex.</p>
</blockquote>
<p>因此,如果字符串实际上是一个regex模式,那么您需要做的不仅仅是排除括号内的逗号。例如,<code>\{,\}</code>不是大括号内用于计数的逗号,而是一个完全正常的文字逗号。在</p>
<p>编写一个完整的regex解析器显然比仅仅计算括号对要复杂一些(尽管如果您想要的是Python<code>re</code>语法,您可以使用该库编译它,然后使用库的调试工具来扫描文本paren,而不是自己编写,但也许你可以通过计算未经扫描的括号对来逃脱惩罚?在</p>
^{pr2}$
<p>(我假设你不想把<code>\,</code>当作一个字面上的逗号。如果你这么做了,那只是一个微不足道的改变。)</p>