猿问

Python正则表达式操作

我想将数据拆分为;,不包括;内部()。例如我有这样的字符串:

string = "Axxx;Bxxx;Cxxx;D(xx;xx)"

我希望输出是:

output = ["Axxx", "Bxxx"; "Cxxx"; "D(xx;xx)"]

我找到了一个解决方案:

output = re.split('\;\s*(?![^()]*\))',string)

它有效并且我检查了re文档,但我仍然不知道它是如何或为什么起作用的。有人可以解释一下吗?


繁花如伊
浏览 119回答 1
1回答

波斯汪

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

相关分类

Python
我要回答