我正在处理一个 .csv 文件,并且一如既往地存在格式问题。在本例中,它是一个 ; 分隔的表格,但有时会有一行包含分号,如下所示:
code;summary;sector;sub_sector
1;fishes;2;2
2;agriculture; also fishes;1;2
3;fishing. Extraction; animals;2;2
所以分为三种情况:
- 没有分号 -> 没问题
- 单词字符(非数字),分号,空格,单词字符(非数字)
- 单词字符(非数字),分号,2x空格,单词字符(非数字)
我将 .csv 转换为 .txt,然后将其作为字符串导入,然后我编译了这个正则表达式:
re.compile('([^\d\W]);\s+([^\d\W])', re.S)
应该怎么做。我几乎设法用逗号替换了那些分号,执行以下操作:
def replace_comma(match):
text = match.group()
return text.replace(';', ',')
regex = re.compile('([^\d\W]);\s+([^\d\W])', re.S)
string2 = string.split('\n')
for n,i in enumerate(string2):
if len(re.findall('([^\d\W]);(\s+)([^\d\W])', i))>=1:
string2[n] = regex.sub(replace_comma, i)
这主要是可行的,但是当分号后有两个空格时,它会在逗号后留下一个 \xa0。这种方法有两个问题:
- 不是很简单
- 为什么要留下这个
\xa0字符?
你知道解决这个问题的更好方法吗?
谢谢
编辑:我想要的输出是:
code;summary;sector;sub_sector
1;fishes;2;2
2;agriculture, also fishes;1;2
3;fishing. Extraction, animals;2;2
编辑:添加了有关将文件转换为字符串以便更好地操作的说明。
请您参考如下方法:
对于这种情况,我不会将 regex、split() 和 rsplit() 与 maxpslit= 一起使用> 参数就够了:
data = '''1;fishes;2;2
2;agriculture; also fishes;1;2
3;fishing. Extraction; animals;2;2'''
for line in data.splitlines():
row = line.split(';', maxsplit=1)
row = row[:1] + row[-1].rsplit(';', maxsplit=2)
row[1] = row[1].replace(';', ',')
print(';'.join(row))
打印:
1;fishes;2;2
2;agriculture, also fishes;1;2
3;fishing. Extraction, animals;2;2
