python regex re.sub删除逗号前的空格

时间:2018-08-22 08:46:50

标签: python regex

我正在尝试编写一个简洁的文本程序,并且为此目的制作了一系列re.subs。这是我要清理的凌乱字符串:

'当我尝试这样做时,逗号不会移到左侧,而句号也会移到左侧。理想情况下,新句子的第一个字母大写。'

import csv, re
with open('spaties.csv', 'r', newline='') as readFile:
reader = csv.reader(readFile)

    with open('spaties3.csv', 'w', newline='') as new_file:
    writer = csv.writer(new_file)

    for line in reader:
        writer.writerow(line)

        #delete duplicate spaces
        ver1 = [re.sub("\s+", " ", x) for x in line]
        writer.writerow(ver1)

        #insert space after .
        ver2 = [re.sub(r'(?<=[.])(?=[^\s])', r' ', x) for x in ver1]
        writer.writerow(ver2)

        #sentence start with uppercase
        ver3 = [re.sub(r'(\.\s[a-z])', lambda pat: pat.group(1).upper(), x) for x in ver2]
        writer.writerow(ver3)

        ver4 = [re.sub("ipv", "i.p.v.", x) for x in ver3]
        writer.writerow(ver4)

        #remove space before .
        ver5 = [re.sub(r'\s([?.!"](?:\s|$))', r'\1', x) for x in ver4]
        writer.writerow(ver5)

        #first letter uppercase
        ver6 = [re.sub(r'(^[a-z])', lambda pat: pat.group(1).upper(), x) for x in ver5]
        writer.writerow(ver6)

        #insert space after ,
        ver7 = [re.sub(r'(?<=[,])(?=[^\s])', r' ', x) for x in ver6]
        writer.writerow(ver7)

        #remove space before ,
        ver8 = [re.sub(r'\s([?,!"](?:\s|$))', r'\1', x) for x in ver7]
        writer.writerow(ver8)

    new_file.close()

这是我得到的最后输出:

'当我尝试这样做时,逗号不会移到左侧,而句号会移到左侧。此外,理想情况下,新句子的第一个字母大写。'

因此它确实正确移动了重复的空格,将句子的首字母大写,但是:

  • 它没有在逗号(ver7)后插入空格
  • 它也没有删除逗号(ver8)之前的空格。
  • 它也将大写字母变为大写。

逗号问题使我感到困惑,因为版本7和版本8与版本2和版本5完全相同。

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您太过复杂了。您可以删除句号,逗号,问号或感叹号之前的所有空格,并使用此正则表达式在其后插入一个空格:

\s*([.,!?])\s*

只是查找.,!?中的一个,在其任一边都用一定数量(可能为0)的空格包围,然后将其替换为\1\1后跟一个空格) ,因此请删除一个空格,然后再将其替换为一个空格。

Demo at regex101