Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字符串中删除多个单词的更好方法?_Python_Regex_String_Python 3.x_Replace - Fatal编程技术网

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]