使用字典截断文本字符串并用X替换单词。蟒蛇

时间:2013-05-21 17:06:26

标签: python dictionary

我正在尝试创建一个简单的程序,它接受一串文本 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)

6 个答案:

答案 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'], '*')