Skip to main content
 首页 » 编程设计

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

2024年11月24日29findumars

我正在处理一个 .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