为了账号安全,请及时绑定邮箱和手机立即绑定

Python正则表达式操作

Python正则表达式操作

繁花如伊 2021-07-28 17:53:59
我想将数据拆分为;,不包括;内部()。例如我有这样的字符串: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 得到不需要的空字符串,记得过滤掉它们


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号