这依赖于引用列表元素的' 字符。使用此信息,它仅使用正则表达式在该字符后面或前面没有逗号的地方拆分:
import re
import pandas as pd
import io
text = """TRUE, 93877, S26476961
TRUE, 93878, ['S26489167', 'S26492524']
FALSE, 93879, S26476962
FALSE, 93880, ['S26489168', 'S26492527', 'S26492528']"""
with io.StringIO(text) as f:
for line in f:
print(re.split("(?<!'), (?!')", line.strip()))
# ['TRUE', '93877', 'S26476961']
# ['TRUE', '93878', "['S26489167', 'S26492524']"]
# ['FALSE', '93879', 'S26476962']
# ['FALSE', '93880', "['S26489168', 'S26492527', 'S26492528']"]
# Or with pandas
with io.StringIO(text) as f:
print(pd.read_csv(f,
header=None,
sep="(?<!'), (?!')",
engine='python'))
# 0 1 2
# 0 True 93877 S26476961
# 1 True 93878 ['S26489167', 'S26492524']
# 2 False 93879 S26476962
# 3 False 93880 ['S26489168', 'S26492527', 'S26492528']
编辑:
如果您使用的是 python2,则需要将文本转换为 unicode(通过将字符 u 放在文本前)才能使用 io.StringIO:
import re
import pandas as pd
import io
text = u"""TRUE, 93877, S26476961
TRUE, 93878, ['S26489167', 'S26492524']
FALSE, 93879, S26476962
FALSE, 93880, ['S26489168', 'S26492527', 'S26492528']"""
with io.StringIO(text) as f:
for line in f:
print(re.split("(?<!'), (?!')", line.strip()))
# ['TRUE', '93877', 'S26476961']
# ['TRUE', '93878', "['S26489167', 'S26492524']"]
# ['FALSE', '93879', 'S26476962']
# ['FALSE', '93880', "['S26489168', 'S26492527', 'S26492528']"]
# Or with pandas
with io.StringIO(text) as f:
print(pd.read_csv(f,
header=None,
sep="(?<!'), (?!')",
engine='python'))
# 0 1 2
# 0 True 93877 S26476961
# 1 True 93878 ['S26489167', 'S26492524']
# 2 False 93879 S26476962
# 3 False 93880 ['S26489168', 'S26492527', 'S26492528']
编辑 2:
如果您不希望依赖引用字符 ' 的存在,可以尝试以下操作:
import ast
import re
with io.StringIO(text) as f:
for line in f:
parts = re.split(", (?=\[)", line.strip())
line = []
for part in parts:
if all(char in part for char in ('[]')):
line.append(ast.literal_eval(part))
else:
line += part.split(", ")
print(line)
您在左方括号之前的逗号处拆分,然后检查结果如下:
- 检查拆分操作生成的列表中的每个元素是否都有方括号。如果是这样,则将其转换为带有
ast.literal_eval 的list 对象,并将其添加到最终输出列表中。
- 否则,以逗号分隔并将随后的列表添加到最终输出列表中。
这应该与上述解决方案相同。
我希望这会有所帮助。