По сути, у меня есть строка, которая имеет несколько двойных пробелов, как это:

"Some text\s\sWhy is there no punctuation\s\s"

У меня также есть список знаков препинания, которые должны заменить двойные пробелы, чтобы вывод был следующим:

puncts = ['.', '?']

# applying some function
# output:
>>> "Some text. Why is there no punctuation?"

Я пытался re.sub(' +', puncts[i], text), но моя проблема здесь в том, что я не знаю, как правильно перебрать список и заменить 1-й двойной пробел на 1-й элемент в пунктах, 2-й двойной пробел на 2-й элемент в проколы и тд.

1
edrftg21 29 Июн 2019 в 19:51

3 ответа

Лучший ответ

Если мы все еще используем re.sub (), вот одно из возможных решений, которое следует этому базовому шаблону:

  1. Получить следующий знак пунктуации.
  2. Замените только первое вхождение этого символа в 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() должен позаботиться об этом.

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

1
tchainzzz 29 Июн 2019 в 17:10

Вы можете сделать это просто используя метод replace!

text = "Some text  Why is there no punctuation  "
puncts = ['.', '?']

for i in puncts:
    text = text.replace("  ", i, 1) #notice the 1 here

print(text)

Выход: Some text.Why is there no punctuation?

0
Taohidul Islam 29 Июн 2019 в 16:58

Вы можете использовать re.split (), чтобы разбить строку на подстроки между двойными пробелами и перемежать знаки препинания, используя join:

import re
string = "Some text  Why is there no punctuation  "
iPunct = iter([". ","? "])
result = "".join(x+next(iPunct,"") for x in re.split(r"\s\s",string))
print(result)
# Some text. Why is there no punctuation?
0
Alain T. 29 Июн 2019 в 17:18