在python中使用正则表达式替换csv中逗号的分号

在python中使用正则表达式替换csv中逗号的分号,python,regex,string,Python,Regex,String,我正在处理一个.csv文件,它总是有格式问题。在这种情况下,它是一个分隔表,但有一行有时有分号,如下所示: code;summary;sector;sub_sector 1;fishes;2;2 2;agriculture; also fishes;1;2 3;fishing. Extraction; animals;2;2 因此有三种情况: 无分号->无问题 单词字符(非数字)、分号、空格、单词字符(非数字) 单词字符(非数字)、分号、空格、单词字符(非数字) 我将.csv转换为.tx

我正在处理一个
.csv
文件,它总是有格式问题。在这种情况下,它是一个
分隔表,但有一行有时有分号,如下所示:

code;summary;sector;sub_sector
1;fishes;2;2
2;agriculture; also fishes;1;2
3;fishing. Extraction;  animals;2;2
因此有三种情况:

  • 无分号->无问题
  • 单词字符(非数字)、分号、空格、单词字符(非数字)
  • 单词字符(非数字)、分号、空格、单词字符(非数字)
我将
.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
是否只有一个特定的“列”出现不需要的分号(即示例中的第2列)?或者,该问题是否会发生在每行的不同“列”中?只有一列(第二列)。我应该添加列名