Python使用re.split按多分隔符拆分字符串时忽略引号内管道符
解决方法
你的问题出在原正则没区分引号内外的分隔符,导致引号里的|也被拆分了。可以用两种方式实现需求:
方法一:用re.findall提取目标内容(更直观)
直接匹配所有需要保留的部分——要么是双引号包裹的内容(包含里面的|),要么是引号外的普通内容,最后再去掉多余的引号:
import re text = r'ced\"|\"ms|n\"|4|98' # 匹配双引号包裹的内容,或引号外不含|的内容 matches = re.findall(r'(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^"|]+)', text) # 去掉内容两端的双引号 finallist = [item.strip('"') if item.startswith('"') else item for item in matches] print(finallist) # 输出: ['ced', 'ms|n', '4', '98']
方法二:修正re.split的正则
构造正则,只匹配不在双引号内部的目标分隔符("|"、引号后紧跟的|、引号前的|),拆分后过滤空字符串:
import re text = r'ced\"|\"ms|n\"|4|98' # 匹配三种合法分隔符,且确保不在引号内 finallist = [x for x in re.split(r'(?:\"\|\"|\|(?=")|(?<!")\|)', text) if x] print(finallist) # 输出: ['ced', 'ms|n', '4', '98']
正则说明:
\"\|\":匹配分隔符"|"\|(?="):匹配后面紧跟双引号的|(比如ms|n"前的|不算,因为它后面是n不是")(?<!")\|:匹配前面没有双引号的|(比如4|98中的|)
内容的提问来源于stack exchange,提问作者user16240226
相关产品推荐
相关产品推荐

