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

2024-06-26 01:51:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串对象(str类型),名为'corpus\ujn'。这是一个由大约一百个句子组成的句子。从这个对象中,我想删除一个名为样板的列表中的子字符串。例如:

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对象


Tags: 对象字符串类型number列表morecontact样板
1条回答
网友
1楼 · 发布于 2024-06-26 01:51:32

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 ']

正如您第一次看到的,单词hellotext替换而来,但是第二次迭代仍然是在原始值上进行的,因此您得到一个没有bye但仍然包含hello的字符串。要删除这两个问题,必须使用上面的解决方案,但不能以那种方式使用生成器

相关问题 更多 >