我有一个名为“ corpus_jn”的字符串对象(类型str)。它由大约一百个句子组成。从这个对象中,我想删除列表中包含的子字符串,称为样板。例如:
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对象?
答案 0 :(得分:1)
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
。要删除两者,您必须使用上面的解决方案,您不能通过这种方式使用生成器。