从字符串中删除多个单词的更好方法是什么?

9
bannedWord = ["Good", "Bad", "Ugly"]
    
def RemoveBannedWords(toPrint, database):
    statement = toPrint
    for x in range(0, len(database)):
        if bannedWord[x] in statement:
            statement = statement.replace(bannedWord[x] + " ", "")
    return statement
        
toPrint = "Hello Ugly Guy, Good To See You."
    
print(RemoveBannedWords(toPrint, bannedWord))

输出结果为Hello Guy, To See You.,我认为使用Python有更好的方法来实现在字符串中更改多个单词。我搜索了一些使用字典的类似解决方案,但似乎并不适合这种情况。
5个回答

16

我使用

bannedWord = ['Good','Bad','Ugly']
toPrint = 'Hello Ugly Guy, Good To See You.'
print(' '.join(i for i in toPrint.split() if i not in bannedWord))

13

这里有一个使用正则表达式的解决方案:

import re
    
def RemoveBannedWords(toPrint,database):
    statement = toPrint
    pattern = re.compile("\\b(Good|Bad|Ugly)\\W", re.I)
    return pattern.sub("", toPrint)
    
toPrint = "Hello Ugly Guy, Good To See You."
    
print(RemoveBannedWords(toPrint,bannedWord))

5
在Ajay的代码上稍作修改,当禁用单词列表中的一个字符串为另一个字符串的子串时。
bannedWord = ['good', 'bad', 'good guy' 'ugly']
toPrint ='good winter good guy'的结果将是:
RemoveBannedWords(toPrint,database = bannedWord) = 'winter good'

因为它先移除good。需要根据列表中元素的长度进行排序。

import re

def RemoveBannedWords(toPrint,database):
    statement = toPrint
    database_1 = sorted(list(database), key=len)
    pattern = re.compile(r"\b(" + "|".join(database_1) + ")\\W", re.I)
    return pattern.sub("", toPrint + ' ')[:-1] #added because it skipped last word

toPrint = 'good winter good guy.'

print(RemoveBannedWords(toPrint,bannedWord))

3

又是一个主题的变体。如果你要经常调用它,那么最好编译一次正则表达式以提高速度:

import re

bannedWord = ['Good', 'Bad', 'Ugly']
re_banned_words = re.compile(r"\b(" + "|".join(bannedWord) + ")\\W", re.I)

def RemoveBannedWords(toPrint):
    global re_banned_words
    return re_banned_words.sub("", toPrint)

toPrint = 'Hello Ugly Guy, Good To See You.'
print(RemoveBannedWords(toPrint))

1
最佳答案,很奇怪为什么只有这么少的投票。如果你需要找到嵌入的词,请在 \\W 后面添加星号“*”:re.compile(r"\b(" + "|".join(list_not_for_search) + ")\\W*", re.I),例如在“Hello uglyyy guy, good to see you.”中将排除“ugly”,并输出“yy”作为其余部分。顺便说一下:re.I 代表 re.IGNORECASE - questionto42

0

由于您正在检查开头的单词边界和结尾处的非单词字符,因此正则表达式是首选。 仍然可以使用内存中的数组/列表

bannedWord = ['Good', 'Bad', 'Ugly']

toPrint = 'Hello Uglyyy Guy, Good To See You.'

for word in bannedWord:
    toPrint = toPrint.replace(word, "")

print(toPrint) 

Hello yy Guy,  To See You.

[Program finished] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接