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:]
使用允许可变长度查找的
regex
模块:(?<![({][^,]*)
是一个零宽度的负查找,它确保,
前面没有(
或{,
匹配文本,
(?![^,]*[})])
是一个零宽度的负前瞻,它确保,
后面不跟任何中间的,
后跟{示例:
^{pr2}$限制:
[({]
匹配(
/{
,而{)
/}
中的任何一个,因此,当子串以(
开头,以}
结尾或相反的方式不适用于嵌套括号/方括号
假设你的方括号可以嵌套,你所拥有的并不是一种常规语言。虽然
re
确实有很多扩展,使它能够处理实际正则表达式之外的事情,但最好使用一个简单的括号计数解析器来处理这一问题。在如下所示(未经测试,但应足够简单,以便理解和调试):
在一篇评论中,当被问及你的方括号是否可以嵌套时,你说:
因此,如果字符串实际上是一个regex模式,那么您需要做的不仅仅是排除括号内的逗号。例如,
\{,\}
不是大括号内用于计数的逗号,而是一个完全正常的文字逗号。在编写一个完整的regex解析器显然比仅仅计算括号对要复杂一些(尽管如果您想要的是Python
^{pr2}$re
语法,您可以使用该库编译它,然后使用库的调试工具来扫描文本paren,而不是自己编写,但也许你可以通过计算未经扫描的括号对来逃脱惩罚?在(我假设你不想把
\,
当作一个字面上的逗号。如果你这么做了,那只是一个微不足道的改变。)相关问题 更多 >
编程相关推荐