Python 从字符串中删除多个单词的更好方法?
输出是Python 从字符串中删除多个单词的更好方法?,python,regex,string,python-3.x,replace,Python,Regex,String,Python 3.x,Replace,输出是Hello Guy,很高兴见到你。了解Python我觉得有更好的方法来实现在字符串中更改几个单词。我使用字典搜索了一些类似的解决方案,但它似乎不适合这种情况。我使用 bannedWord = ['Good','Bad','Ugly'] def RemoveBannedWords(toPrint,database): statement = toPrint for x in range(0,len(database)): if bannedWord[x] i
Hello Guy,很高兴见到你。
了解Python我觉得有更好的方法来实现在字符串中更改几个单词。我使用字典搜索了一些类似的解决方案,但它似乎不适合这种情况。我使用
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)
下面是一个使用正则表达式的解决方案:
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)
另一个主题的变化。如果要经常调用此函数,则最好编译一次正则表达式以提高速度:
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)
当其中一个字符串是bannedWord列表中另一个字符串的子字符串时,Ajay的代码略有变化
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))
toPrint='good winter good guy'
的结果是
bannedWord = ['good', 'bad', 'good guy' 'ugly']
因为它将首先删除良好
。需要对列表中元素的长度进行排序
RemoveBannedWords(toPrint,database = bannedWord) = 'winter 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))
你不再真正使用
bannedWord
,所以你最好去掉re.compile(r“\b”(“+”|“).join(database)+“\\W”,re.I)
如果你使用@worldssender的建议,那么如果bannedWords列表变大,这是否可行呢?甚至可能15-20岁words@Lorenz别担心,每个人都会犯错。重要的是你清楚地表达了为什么你认为需要编辑。请继续做你认为合适的编辑,并解释你的理由,这是非常感谢。这是聪明的我喜欢它。这会消耗更多的循环吗?@AndyWong这与你的RemoveBannedWords
函数的循环数相同。@AndyWong有一个问题:“坏!”不会被过滤。最好的答案,奇怪的是它的投票数如此之少。如果需要查找嵌入的单词,请在\\W
中添加星号“*”:re.compile(r”\b(“+”|“)。join(list_not_for_search)+“\\W*”,re.I)
。比如在“你好,丑家伙,再见。”这将排除“丑”并给出“yy”作为其余部分。顺便说一下:re.I
代表re.IGNORECASE。
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]