0

我正在尝试编写一个从一个文件读取输入的代码,用“xxxx”替换所有四个字母的单词,然后将其写入另一个文件。我知道这个问题已经出现在网站上,我已经用谷歌搜索了其他问题,但它们都是一样的。我也玩过代码,但仍然无法找到解决方案。

def censor(filename):
    'string ==> None, creates file censored.txt in current folder with all 4 letter words replaces with string xxxx'
    import string
    infile = open(filename,'r')
    infile2 = open('censored.txt','w')
    for word in infile:
        words = word.split()
        for i, word in enumerate(words):
            words.strip(string.punctuation)
            if len(word) == 4:
                words[i] == 'xxxx'
                infile2.write(words[i])

我知道这只是一堆不起作用的代码,但我认为发布任何内容都是值得的。我有一个想法,从文本中删除标点符号,这样它就不会将某些 4 个字母的单词算作 5 个带有标点符号的单词,将单词拆分成一个列表以更改四个字母的单词,然后将它们按原始顺序重新组合在一起,只是替换了单词。所以“我喜欢工作”。最终会是“我 xxxx 到 xxxx”。

我还查看了该站点上的另一个类似帖子,并找到了一个可行的解决方案,但没有解决标点符号问题。

def maybe_replace(word, length=4):
    if len(word) == length:
        return 'xxxx'
    else:
        return word

def replacement(filename):
    infile = open(filename,'r')
    outfile = open('censored.txt','w')
    for line in infile:
        words = line.split()
        newWords = [maybe_replace(word) for word in words]
        newLine = ' '.join(newWords)
        outfile.write(newLine + '\n')
    outfile.close()
    infile.close()

所以在这种情况下,如果我有一个单词列表,例如“Frog, boot, cat, dog”。它会返回“Frog, boot, xxxx xxxx”

我还找到了另一个使用正则表达式的解决方案,但我还是个新手,真的无法理解那个解决方案。任何帮助,将不胜感激。

4

3 回答 3

3

正则表达式解决方案非常简单:

import re

text = """
    I also found another solution using 
    regex, but I'm still a novice and 
    really can't understand that solution. 
    Any help would be appreciated.
"""

print re.sub(r'\b\w{4}\b', 'xxxx', text)

正则表达式匹配:

  • \b,这是一个单词边界。它匹配单词的开头或结尾。
  • \w{4}匹配四个单词字符(、a-zA-Z)。0-9_
  • \b是另一个词边界。

输出是:

I xxxx found another solution using 
regex, but I'm still a novice and 
really can't understand xxxx solution. 
Any xxxx would be appreciated.
于 2013-03-04T06:53:10.043 回答
1

您的第二段代码有问题words = line.split()。默认情况下,它会在空格上拆分,因此“,”被视为您单词的一部分。

如果你真的不想接触正则表达式,这是我的建议(仍然涉及一点正则表达式):

import re
words = re.split('[\W]+', line)

这要求 python 在非字母数字字符上拆分行。

于 2013-03-04T06:55:54.637 回答
0

我们有我的答案!:)

import string as s
alfanum = s.ascii_letters + s.digits

def maybe_replace(arg, length=4):
    word = ""
    for t in arg: word += t if t in alfanum else ""

    if len(word) == length: 
        if len(arg)>4: return 'xxxx'+arg[4:]
        else: return 'xxxx'
    else: 
      return arg

text = "Frog! boot, cat, dog. bye, bye!"
words = text.split()
print words
print [maybe_replace(word) for word in words]

>>> ['Frog!', 'boot,', 'cat,', 'dog.', 'bye,', 'bye!']
>>> ['xxxx!', 'xxxx,', 'cat,', 'dog.', 'bye,', 'bye!']
于 2013-03-04T06:59:28.367 回答