当前位置: 首页 > 面试题库 >

如何在python中拆分但忽略带引号的字符串中的分隔符?

沙宣
2023-03-14
问题内容

我需要在分号上分割这样的字符串。但是我不想分割字符串(“或”)内的分号。我不是在解析文件;只是一个没有换行符的简单字符串。

part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5

结果应为:

  • 第1部分
  • “这是;第2部分;”
  • ‘这是 ; 第三部分
  • 第4部分
  • 这是“一部分” 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'"]

但是,这太过分了。还有更好的建议吗?



 类似资料: