我想按;
拆分数据,但不包括;
中的()
。例如,我有这样的字符串:
string = "Axxx;Bxxx;Cxxx;D(xx;xx)"
我希望输出是:
output = ["Axxx", "Bxxx"; "Cxxx"; "D(xx;xx)"]
我找到了解决方法:
output = re.split('\;\s*(?![^()]*\))',string)
它可以工作,我检查了re
文档,但是我仍然不知道它如何工作或为什么起作用。有人可以解释吗?
答案 0 :(得分:3)
即使没有解决方案,也可能有替代解决方案,但这是我的细目分类 重新分割
{p}的 split
函数,在匹配模式的任何字符序列中分割字符串,而不仅仅是一个给定的符号或字符串
让我们分解模式
re
-分隔符为分号(斜线表示转义,可以防止特殊代码造成混淆)
\;
-可能后跟空格或其他空格字符,您无需在示例中使用它,但不会造成伤害
\s*
-否定超前断言。它强加了附加限制,即哪些分号要分割字符串,哪些要忽略。 Lookahead 表示不要将与(?!
内的子模式匹配的字符串部分包含在分隔符中,负表示要视为分隔符,分号应不要后跟禁止的序列。即,非方括号(?! ... )
的可能为空的序列(*
)后跟右方括号[^()]
,可以防止出现中断。 (例如您的示例中的\)
。但是在带有分号和分号的分号后也可以使用表达式(在您的情况下,xx)
。基本上,先行禁止您进入一对匹配的括号内)。
正则表达式的完整列表可以在官方文档中找到,但是如果您难以阅读或理解,请阅读一些教程。
我相信在以前的文章中,我看到了D(xx;xx)
的更简单的解决方案,它不需要先行。
PS。有时您会通过re.split收到不需要的空字符串,请记住将其过滤掉