Удалите подстроки в строковом объекте, если эти подстроки соответствуют строке в списке. питон - PullRequest
0 голосов
/ 29 августа 2018

У меня есть строковый объект (тип str) с именем 'corpus_jn'. Он состоит из около ста предложений. Из этого объекта я хотел бы удалить подстроки из списка шаблонов. Пример:

boilerplates = ['Contact Number: 444-444-4444.', 'More information provided on request.']
corpus_jn = (corpus_jn.replace(sentence, '') for sentence in boilerplates)

Код выполняется, но когда я пытаюсь распечатать его, он выводит объект генератора:

print(corpus_jn)

<generator object <genexpr> at 0x0000000012552518>

Как мне сохранить или вывести мой объект str?

1 Ответ

0 голосов
/ 29 августа 2018

replace не изменяет исходную строку. Вам нужно переназначить его для каждого предложения:

for sentence in boilerplates:
    corpus_jn = corpus_jn.replace(sentence, '')

Или вы можете использовать регулярное выражение:

import re
regex = '|'.join(map(re.escape, boilerplates))
corpus_jn = re.sub(regex, '', corpus_jn)

Это, вероятно, будет более эффективным, поскольку итерирует по строке только один раз.


Просто чтобы уточнить: ваши исходные коды не заменяют вообще. Аргумент str является выражением-генератором, которое создает объект generator, который ничего не делает, пока что-то не перебирает его.

Однако вызов str не повторяет его, он просто преобразует его в этот <generator object ...> текст.

Даже если вы правильно использовали генератор, используя ''.join или понимание списка, вы не получили бы то, что ожидали:

>>> text = 'hello 123 hello bye'
>>> boilerplates = ['hello', 'bye']
>>> [text.replace(sentence, '') for sentence in boilerplates]
[' 123  bye', 'hello 123 hello ']

Как вы можете видеть в первый раз, когда слово hello заменяется на text, но вторая итерация по-прежнему выполняется для исходного значения, и, следовательно, вы получаете строку без bye, но она по-прежнему содержит hello , Чтобы удалить оба, вы должны использовать решения, описанные выше, вы не можете сделать это, используя генератор таким образом.

...