Регулярное выражение python re.sub удалить пробел перед запятой

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

Заранее спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
806
1

Ответы 1

Я думаю, вы слишком усложняете. Вы можете удалить все пробелы перед точкой, запятой, вопросительным знаком или восклицательным знаком и вставить один после них с помощью этого регулярного выражения:

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

который просто ищет один из .,!?, окруженный некоторым числом (которое может быть 0) пробелов с обеих сторон, а затем заменяет его на \1 (\1, за которым следует пробел), таким образом удаляя все пробелы до и заменяя любые пробелы после одного пробела .

Демо на regex101

Спасибо за ответ. Выглядит хорошо, единственное, что я заметил по этому поводу, это то, что он заменяет символы [.,!?] Своего рода вопросительным знаком в скобках в терминале. В csv это выглядит как []. Почему это могло быть?

robbah 22.08.2018 11:21

Вероятно, вы заменяете недопустимый символ вместо пустой строки. Я предполагаю, что вы поместили '\1', который производит символ Control-A.

tripleee 22.08.2018 12:01

@tripleee, спасибо за это. Я отредактировал ответ, чтобы, надеюсь, было понятнее, что такое строка замены.

Nick 22.08.2018 12:04

спасибо обоим. Из всех символов в скобках не работает только запятая. Может ли это быть связано с тем, что разделитель является запятой в файле csv?

robbah 22.08.2018 12:29

@robbah да, это могло быть так. Если запятые не заменяются, может показаться, что строка, которую вы пытаетесь очистить, разбивается на запятые, и поэтому их нет в обрабатываемых значениях. Возможно, вам нужно изменить quotechar, чтобы убедиться, что строка заканчивается единственным значением в строке.

Nick 23.08.2018 00:24

Другие вопросы по теме