我想将数据拆分为;,不包括;内部()。例如我有这样的字符串:string = "Axxx;Bxxx;Cxxx;D(xx;xx)"我希望输出是:output = ["Axxx", "Bxxx"; "Cxxx"; "D(xx;xx)"]我找到了一个解决方案:output = re.split('\;\s*(?![^()]*\))',string)它有效并且我检查了re文档,但我仍然不知道它是如何或为什么起作用的。有人可以解释一下吗?
1 回答

波斯汪
TA贡献1811条经验 获得超4个赞
即使没有 re,也可能有其他解决方案,但这是我对 re.split 的细分
split
函数 from re
,在匹配模式的任何字符序列上拆分字符串,而不仅仅是一个给定的符号或字符串
让我们分解一下模式
\;
- 分隔符是分号(斜线表示转义,它可以防止与特殊代码混淆)
\s*
- 可能后跟空格或其他空白字符,您的示例不需要它,但它不会受到伤害
(?!
-否定前瞻断言。它对分割字符串和忽略哪些分号施加了额外的限制。先行装置不会不包括的子模式内相匹配的字符串的一部分(?! ... )
进入分离器,负意味着被认为是分离器的分号应该不被随后禁止序列。即一个可能为空*
的非括号序列 ( )[^()]
后跟一个右括号\)
排除了中断。(例如xx)
在您的示例中。但是在分号之后可以有表达式,它具有D(xx;xx)
左括号和右括号(在您的情况下。基本上向前看禁止您在一对匹配的括号内中断。
可以在官方文档中找到正则表达式的完整列表,但如果您觉得难以阅读或理解,请阅读一些教程。
我相信在上一篇文章中,我看到了一个更简单的解决方案,re.findall
它不需要前瞻。
附注。有时你会用 re.split 得到不需要的空字符串,记得过滤掉它们
添加回答
举报
0/150
提交
取消