我哪里错了?计算 python 中不包括页眉和页脚的总字数?

Where i am wrong? Count total words excluding header and footer in python?

这是我正在尝试读取的文件并计算该文件中的总字数test.txt

我已经为它写了代码:

def create_wordlist(filename, is_Gutenberg=True):
    words = 0
    wordList = []
    data = False
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    file1 = open("temp",'w+')
    with open(filename, 'r') as file:
        if is_Gutenberg:
            for line in file:
                if line.startswith("*** START "):
                    data = True
                    continue
                if line.startswith("End of the Project Gutenberg EBook"):
                    #data = False
                    break
                if data:
                    line = line.strip().replace("-"," ")
                    line = line.replace("_"," ")
                    line = regex.sub("",line)
                    for word in line.split():
                        wordList.append(word.lower()) 
                    #print(wordList)
                    #words = words + len(wordList)

    return len(wordList)          
    #return wordList
create_wordlist('test.txt', True)

以下是一些需要遵循的规则: 1.去掉空格和标点符号 2.用空格替换连字符 3.skip 文件页眉和页脚。页眉以“*** START OF THIS”开头的行结尾,页脚以 "End of the Project".

开头

My answer: 60513 but the actual answer is 60570. This answer came with the question itself. It may be correct or wrong. Where I am doing it wrong.

如果没有显示此行为的示例文本文件,则很难猜出哪里出了问题。但有一个线索:您的数字比您预期的少。这似乎意味着您以某种方式将单独的单词粘合在一起,并将它们算作一个单词。这种行为的明显候选者是语句 line = regex.sub("",line):它用空字符串替换任何标点符号。因此,如果文本包含 that's,您的程序会将其更改为 thats.

如果这不是原因,您确实需要提供一小段文本示例来显示您获得的行为。

编辑:如果您打算将标点符号视为单词分隔符,则应将标点符号替换为space,因此:line = regex.sub(" ",line)

您为实际答案提供了一个数字——您认为正确的答案,您希望代码输出。

你没有告诉我们你是怎么得到那个号码的。

在我看来,这两个数字来自 "word" 的不同定义。

例如,您在示例文本中有几个表格中的数字: 140,000,000

是一字还是三字?

您正在用空格替换连字符,因此带连字符的单词将被计为两个。您要删除的其他标点符号。这将使上述数字(以及您的文本中其他类似的示例)成为一个词。那是你想要的吗?这是为了获得您的 "correct" 号码所做的吗?我怀疑这是你的全部或部分差异。

快速浏览一下,我在上面的表格中看到了三个数字(算作 3 或 9,相差 6) 我看到 127 个撇号(像 wife's 这样的词,可以算作一个或两个),相差 127。

你的差异是 57,所以答案不是那么简单,但我仍然强烈怀疑对于特定的极端情况,单词是什么的不同定义。

顺便说一句,我不确定您为什么要将所有单词收集到一个巨大的列表中然后计算长度。您可以跳过追加循环,只累加 len(line.split()) 的总和。这将消除复杂性,从而减少错误的可能性(并且可能使程序更快,如果在这种情况下很重要的话)

另外,你有一行:

                if line.startswith("*** START " in"):

当我在 python 解释器中尝试这样做时,出现语法错误。你确定你在这里发布的代码就是你的代码吗运行?我本以为:

                if line.startswith("*** START "):