1

我正在尝试制作一个简单的脚本,为指定的 .txt 文件搜索以大写字母开头的最后一个单词并返回它。如果没有以大写字母开头的单词,则返回一个空字符串。

这是我到目前为止所尝试的:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for word in word_list:
            if word.rfind(upper):
                return word
            else:
                return " "

但这不起作用。

我也试过这个:

    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        for word in word_list:
            if word_list[-1].isupper():
                return word_list[-1]
            else:
                return " "

有什么帮助吗?

4

8 回答 8

2

其他人为您提供了各种方法来完成您的任务。我想解释为什么你的第一种方法不能按预期工作:

upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if word.rfind(upper):

.rfind的方法是在里面str寻找最后一个子串的位置。我猜你的话不包含这样的子字符串,在这种情况下返回,根据 Python 的规则评估为(因为它不为零),所以它几乎可以捕获任何单词(它会给出或只给出以and开头的单词只包含一个)ABCDEFGHIJKLMNOPQRSTUVWXYZword.rfind-1True0FalseABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

于 2019-05-29T12:48:50.527 回答
1

看起来你需要reversed

前任:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        for word in reversed(word_list):   #reversed
            if word[0].isupper():
                return word
    return " "
于 2019-05-29T12:34:29.790 回答
1

您需要" "在第一次失败时返回。这就是为什么你没有得到预期的结果。

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        for word in reversed(word_list):
            if word[0].isupper():
                return word
        return ""

但是,如果您的文件更大,您可能希望以相反的顺序读取文件。这将使您更容易找到所需的内容。

import os

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        wordfile.seek(0, os.SEEK_END)
        position = wordfile.tell()
        word = ''
        while position >= 0:
            qfile.seek(position)
            next_char = qfile.read(1)
            if next_char == " ":
                if word[0].isupper():
                    return word
                word = ''
            else:
                word += next_char
            position -= 1
        return ""

我建议使用类似的方法来解决您的问题。

于 2019-05-29T12:34:59.543 回答
1

您可以尝试使用reversedandis_upper关键字:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        word_list = reversed(word_list)
        for word in word_list:
            if word[0].isupper():
                return word

print(find_last_capitalised("demo.txt"))
于 2019-05-29T12:35:39.017 回答
1

首先,您的算法将返回第一个大写单词,而不是最后一个,因此需要对逻辑进行一些更改。还提供了检查单词是否大写的最简单方法:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        last_cap_word = " "
        for word in word_list:
            if word[0].isupper():
                last_cap_word = word

        return last_cap_word
于 2019-05-29T12:36:17.763 回答
1

我做了这样的事情。

import re
pattern = "[A-Z][a-zA-Z]+"

with open('input.txt', 'r') as file:
  for el in reversed(file.readlines()):
    res = re.findall(pattern, el)
    if res:
      print(res[-1]) 

于 2019-05-29T12:37:29.040 回答
1
def find_last_capitalised(word_list):
    lastCapWord = " "
    for word in word_list:
        print(word)
        if word[0].isupper():
            lastCapWord = word
    print('lastCapWord:', lastCapWord)
    return lastCapWord


word_list = ['this', 'is', 'A', 'test']
find_last_capitalised(word_list)

你的算法有点不对劲。它不会遍历列表中的每个单词,而是根据它看到的第一个单词返回。假设你让你的单词列表变成一个数组,下面的代码应该可以正常工作。

于 2019-05-29T12:44:04.037 回答
0
def find_last_capitalised(file_name):
with open(file_name) as wordfile:
    text_str = wordfile.read()
    word_list = text_str.split(" ")
    upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for word in reversed(word_list):
        if upper.rfind(word[0]) >= 0:
        return word
    return " "

请尝试使用上面的代码......如果它不起作用,请在这里告诉我。

于 2019-05-29T12:53:32.000 回答