我正在尝试创建一个简单的程序,它接受一串文本 t 和一个单词列表 l 并打印文本但是带有中的单词> l 被替换为与单词中的字母对应的多个X.
问题:我的代码还替换了与 l 中的单词匹配的单词部分。我怎样才能使它只针对整个词?
def censor(t, l):
for cenword in l:
number_of_X = len(cenword)
sensurliste = {cenword : ("x"*len(cenword))}
for cenword, x in sensurliste.items():
word = t.replace(cenword, x)
t = word.replace(cenword, x)
print (word)
答案 0 :(得分:1)
首先,我相信你想让你的for循环处于同一水平,所以当一个完成另一个开始时。
其次,看起来你有额外的代码并没有真正做任何事情。
例如,sensurliste
只会有删除的单词,与“X”字符串配对。因此,第一个for循环是不需要的,因为在第二个for循环中仅在现场创建“X”字符串是微不足道的。
然后,你说 word = t.replace(cenword,x) T = word.replace(cenword,x)的
第二行不执行任何操作,因为word
已经替换了所有cenword实例。所以,这可以简化为
t = t.replace(cenword,x);
最后,这就是你的问题所在,python replace方法并不关心单词边界。所以它将取代所有的中心词,无论它是否是一个完整的词。
你可以使用正则表达式来制作它所以它只会找到完整单词的实例,但是,我只会使用更多的内容
def censort(t,l):
words = t.split() #split the words into a list
for i in range(len(words)): #for each word in the text
if words[i] in l: #if it needs to be censoredx
words[i] = "X"*len(words[i]) #replace it with X's
t=words.join() #rejoin the list into a string
答案 1 :(得分:1)
另一种方法是使用正则表达式来获取所有单词:
import re
blacklist = ['ccc', 'eee']
def replace(match):
word = match.group()
if word.lower() in blacklist:
return 'x' * len(word)
else:
return word
text = 'aaa bbb ccc. ddd eee xcccx.'
text = re.sub(r'\b\w*\b', replace, text, flags=re.I|re.U)
print(text)
这有利于正则表达式识别的各种单词边界。
答案 2 :(得分:1)
这很容易理解和清洁
def censor(text, word):
return text.replace(word, ("*"*len(word)))
答案 3 :(得分:0)
您可以使用RegExp(模块重新)进行替换,也可以将输入字符串拆分为您认为的“整个单词”。
如果您将任何分隔的空格视为单词,则可以执行以下操作:
def censor(t, l):
for cenword in l:
number_of_X = len(cenword)
sensurliste = {cenword : ("x"*len(cenword))}
censored = []
for word in t.split():
append(sensurliste.get(word, word))
return ' '.join(censurliste)
请注意,这不会保留原始间距。此外,如果您的文本包含标点符号,则可能无法生成您认为应该使用的符号。例如,如果 t 包含单词'stupid!',但列表只有'stupid',则不会被替换。
如果您想解决所有这些问题,则需要执行tokenisation。您可能还需要考虑大写单词。
答案 4 :(得分:0)
我做得更紧凑:
def censor_string(text, banned_words, replacer):
return "".join([x + " " if x.lower() not in banned_words else replacer*len(x) + " " for x in text.split(" ") ])
但是我遇到诸如“?”之类的特殊符号的问题。或昏迷。 如果我将在以下功能下运行:
censor_string("Today is a Wednesday!", ["is", "Wednesday"], "*")
我收到的是 “今天是星期三!”而不是“今天**一个*********!”
任何死者如何跳过,忽略字符串中的字母和数字之外的任何内容?
答案 5 :(得分:0)
def censor_string(text, censorlst, replacer):
word_list = text.split()
for censor in censorlst:
index = 0
for word in word_list:
if censor.lower() == word.lower():
ch = len(censor) * replacer
word_list[index] = ch
elif censor.lower() == word[0:-1].lower():
ch = len(censor) * replacer
word_list[index] = ch+word[-1]
index+=1
return " ".join(word_list)
censor_string('Today is a Wednesday!', ['Today', 'a'], '-')
censor_string('The cow jumped over the moon.', ['cow', 'over'], '*')
censor_string('Why did the chicken cross the road?', ['Did', 'chicken','road'], '*')