正则表达式按竖线分割时忽略括号内竖线的实现疑问
解决括号外竖线分割的问题
你原来的正则\|\s*(?![^()]*\))只能处理单层括号,遇到嵌套括号时会失效。原因是[^()]*会匹配到第一个左括号(就停止,无法识别嵌套的括号结构,导致括号内的竖线被误分割。
以下是两种可行的解决方案:
方案1:手动遍历(通用,支持任意嵌套)
这种方法通过跟踪括号深度,只在深度为0(不在任何括号内)时分割竖线,完全不受嵌套层数限制,是最可靠的方案:
my_string = "(chargeur|magn(e|é)tique) sans fil|chargeur solaire (imperm(e|é)able|pliable)|chargeur ext(e|é)rieur externe|chargeur de t(e|é)l(e|é)phone solaire" def split_outside_brackets(s, sep='|'): parts = [] current_part = [] bracket_depth = 0 for c in s: if c == '(': bracket_depth += 1 elif c == ')': bracket_depth = max(bracket_depth - 1, 0) # 避免出现负深度 elif c == sep and bracket_depth == 0: parts.append(''.join(current_part).strip()) current_part = [] continue current_part.append(c) # 添加最后一段内容 parts.append(''.join(current_part).strip()) return parts my_list = split_outside_brackets(my_string) print(my_list)
运行结果完全符合预期:
['(chargeur|magn(e|é)tique) sans fil', 'chargeur solaire (imperm(e|é)able|pliable)', 'chargeur ext(e|é)rieur externe', 'chargeur de t(e|é)l(e|é)phone solaire']
方案2:正则表达式(适用于有限嵌套)
如果你的字符串嵌套层数固定(比如最多两层),可以用调整后的正则,确保能识别嵌套括号:
import re my_string = "(chargeur|magn(e|é)tique) sans fil|chargeur solaire (imperm(e|é)able|pliable)|chargeur ext(e|é)rieur externe|chargeur de t(e|é)l(e|é)phone solaire" # 支持两层嵌套的正则 my_list = re.split(r'\|\s*(?=(?:[^()]|\([^()]*(?:\([^()]*\))*[^()]*\))*$)', my_string) # 去除可能的空字符串(如果首尾有多余分隔符) my_list = [part.strip() for part in my_list if part.strip()] print(my_list)
正则说明:
\|\s*:匹配竖线和后面的任意空白字符(?=(?:[^()]|\([^()]*(?:\([^()]*\))*[^()]*\))*$):正向预查确保,从当前位置到字符串结尾,所有括号都是平衡的(支持两层嵌套)
内容的提问来源于stack exchange,提问作者alinapal
相关产品推荐
相关产品推荐

