我需要在分号上分割这样的字符串。但是我不想分割字符串(“或”)内的分号。我不是在解析文件;只是一个没有换行符的简单字符串。
part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5
结果应为:
我想这可以用正则表达式来完成,但是如果不能的话;我愿意接受另一种方法。
大多数答案似乎过于复杂。你 并不 需要反向引用。你 并不
需要依赖于是否re.findall给出重叠的匹配。鉴于输入无法使用csv模块进行解析,因此正则表达式是唯一可行的方法,您所要做的就是使用与字段匹配的模式调用re.split。
请注意,这里匹配字段比匹配分隔符要容易得多:
import re
data = """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'"]
但是,这太过分了。还有更好的建议吗?