如果这些字符串与列表中的字符串匹配,则删除字符串对象中的子字符串。蟒蛇

时间:2018-08-29 16:10:58

标签: python string list text list-comprehension

我有一个名为“ 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对象?

1 个答案:

答案 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。要删除两者,您必须使用上面的解决方案,您不能通过这种方式使用生成器。