在python中使用regex在CSV中替换逗号的分号

时间:2019-07-09 21:06:03

标签: 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

所以有三种情况:

  • 没有分号->没问题
  • 单词字符(非数字),分号,空格,单词字符(非数字)
  • 单词字符(非数字),分号,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

编辑:添加了有关将文件转换为字符串以进行更好操作的说明。

1 个答案:

答案 0 :(得分:1)

在这种情况下,我不会将regexsplit()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