大多数答案似乎过于复杂。你 并不 需要反向引用。你 并不
需要依赖于是否re.findall给出重叠的匹配。鉴于输入无法使用csv模块进行解析,因此正则表达式是唯一可行的方法,您所要做的就是使用与字段匹配的模式调用re.split。
请注意,这里匹配字段比匹配分隔符要容易得多:
import redata = """part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5"""PATTERN = re.compile(r'''((?:[^;"']|"[^"]*"|'[^']*')+)''')print PATTERN.split(data)[1::2]
输出为:
['part 1', '"this is ; part 2;"', "'this is ; part 3'", 'part 4', 'this "is ; part" 5']
正如Jean-Luc Nacif
Coelho正确指出的那样,这将无法正确处理空组。根据情况可能会或可能不会重要。如果确实如此,则可以通过以下方式处理该问题,例如,将必须知道在拆分之前未出现在数据中的某些字符串(不带分号)替换
';;'为
';<marker>;'where
<marker>。另外,您还需要在以下时间恢复数据:
>>> marker = ";!$%^&;">>> [r.replace(marker[1:-1],'') for r in PATTERN.split("aaa;;aaa;'b;;b'".replace(';;', marker))[1::2]]['aaa', '', 'aaa', "'b;;b'"]但是,这太过分了。还有更好的建议吗?



