我正在尝试编写一个简洁的文本程序,并且为此目的制作了一系列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()
这是我得到的最后输出:
'当我尝试这样做时,逗号不会移到左侧,而句号会移到左侧。此外,理想情况下,新句子的第一个字母大写。'
因此它确实正确移动了重复的空格,将句子的首字母大写,但是:
逗号问题使我感到困惑,因为版本7和版本8与版本2和版本5完全相同。
谢谢!
答案 0 :(得分:2)
我认为您太过复杂了。您可以删除句号,逗号,问号或感叹号之前的所有空格,并使用此正则表达式在其后插入一个空格:
\s*([.,!?])\s*
只是查找.,!?
中的一个,在其任一边都用一定数量(可能为0)的空格包围,然后将其替换为\1
(\1
后跟一个空格) ,因此请删除一个空格,然后再将其替换为一个空格。