Я пытаюсь сделать небольшую программу с чистым текстом, и для этой цели я сделал последовательность 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.
Заранее спасибо!






Я думаю, вы слишком усложняете. Вы можете удалить все пробелы перед точкой, запятой, вопросительным знаком или восклицательным знаком и вставить один после них с помощью этого регулярного выражения:
\s*([.,!?])\s*
который просто ищет один из .,!?, окруженный некоторым числом (которое может быть 0) пробелов с обеих сторон, а затем заменяет его на \1 (\1, за которым следует пробел), таким образом удаляя все пробелы до и заменяя любые пробелы после одного пробела .
Вероятно, вы заменяете недопустимый символ вместо пустой строки. Я предполагаю, что вы поместили '\1', который производит символ Control-A.
@tripleee, спасибо за это. Я отредактировал ответ, чтобы, надеюсь, было понятнее, что такое строка замены.
спасибо обоим. Из всех символов в скобках не работает только запятая. Может ли это быть связано с тем, что разделитель является запятой в файле csv?
@robbah да, это могло быть так. Если запятые не заменяются, может показаться, что строка, которую вы пытаетесь очистить, разбивается на запятые, и поэтому их нет в обрабатываемых значениях. Возможно, вам нужно изменить quotechar, чтобы убедиться, что строка заканчивается единственным значением в строке.
Спасибо за ответ. Выглядит хорошо, единственное, что я заметил по этому поводу, это то, что он заменяет символы [.,!?] Своего рода вопросительным знаком в скобках в терминале. В csv это выглядит как []. Почему это могло быть?