Заменить подстроки элементами из списка - PullRequest
2 голосов
/ 29 июня 2019

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

"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-йдвойной пробел со вторым элементом в пунктах и ​​т. д.

Ответы [ 3 ]

1 голос
/ 29 июня 2019

Если мы все еще используем 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() должен позаботиться об этом.

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

0 голосов
/ 29 июня 2019

Вы можете использовать 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 голосов
/ 29 июня 2019

Вы можете сделать это просто, используя метод 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...