正则表达式:按括号拆分字符串但排除特定前缀后的括号
拆分字符串时排除特定前缀后的括号
需要拆分包含左右括号的字符串,但要排除前面带有特定子串(如ue)的括号。示例如下:
输入字符串:
a = 'abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl'
期望输出列表:
['abc', 'xyz pqr', 'qwe ew', 'kjlk asd', 'ue(aad)', 'kljl']
即保留ue(aad),不对其中的(aad)进行拆分。
你尝试的代码:
y = [x.strip() for x in re.split(r"[^ue()][()]", a) if x.strip()]
问题分析
你写的正则有两个明显问题:
[^ue()]会匹配所有不是u、e、(、)的字符,拆分时会把括号前的正常字符(比如abc (里的空格)也吃掉,导致结果出现缺失;- 逻辑上没精准覆盖“排除
ue前缀后括号”的需求,没法区分普通括号和ue后的括号。
正确实现
用负向预查就能精准实现需求,正则表达式为(?<!ue)[()],完整代码如下:
import re a = 'abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl' result = [x.strip() for x in re.split(r"(?<!ue)[()]", a) if x.strip()] print(result)
正则说明
(?<!ue):负向零宽断言,检查当前位置的前面不是ue这个子串,只有满足这个条件的括号才会被当作分隔符;[()]:匹配左括号或右括号,作为拆分的标记;- 最后用
strip()清理拆分后元素的前后空白,再过滤掉空字符串,就能得到你要的结果。
内容的提问来源于stack exchange,提问作者Will Jue
相关产品推荐
相关产品推荐

