Если мы все еще используем re.sub (), вот одно из возможных решений, которое следует этому базовому шаблону:
- Получить следующий символ пунктуации.
- Заменить только первыйвхождение этого символа в
text
.
puncts = ['.', '?']
text = "Some text Why is there no punctuation "
for i in puncts:
text = re.sub('\s(?=\s)', i, text, 1)
Вызов re.sub () возвращает строку и в основном говорит «найти все серии из двух символов пробела, но заменить только первыйсимвол пробела с символом пунктуации. "Последний аргумент «1» позволяет заменить только первый экземпляр двойного пробела, а не все (поведение по умолчанию).
Если положительный взгляд (часть регулярного выражения, которое мы хотим сопоставить, но не заменить) сбивает вас с толку, вы также можете обойтись без него:
puncts = ['.', '?']
text = "Some text Why is there no punctuation "
for i in puncts:
text = re.sub('\s\s', i + " ", text, 1)
Это дает тот же результат.
В конце предложения будет оставшийся пробел, но если вы скупитесь на это, простой text.rstrip()
должен позаботиться об этом.
ДалееОбъяснение Ваша первая попытка использования регулярного выражения ' +'
не работает, потому что это регулярное выражение соответствует всем случаям, где есть хотя бы один пробел, то есть оно будет соответствовать всему, а затем также заменяет все символы пунктуации,Приведенные выше решения учитывают двойное пространство в соответствующих регулярных выражениях.