返回以大写字母开头的文件中的最后一个单词

时间:2019-05-29 12:27:36

标签: python

我正在尝试创建一个简单的脚本,该脚本为指定的.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 " "

有帮助吗?

8 个答案:

答案 0 :(得分:2)

其他人为您提供了多种执行任务的方法。我想解释一下为什么您的第一种方法无法按预期工作:

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

str方法正在寻找ABCDEFGHIJKLMNOPQRSTUVWXYZ内最后一个子串word的位置。我猜您的单词中不包含这样的子字符串,在这种情况下,.rfind返回-1,根据Python的规则,它的值为True(因为它不为零),因此它将捕获几乎所有单词(仅以0开头且仅包含单个False的单词会给出ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

答案 1 :(得分: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 " "

答案 2 :(得分: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 ""

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

答案 3 :(得分:1)

您可以尝试使用reversedis_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"))

答案 4 :(得分: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

答案 5 :(得分: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]) 

答案 6 :(得分: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)

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

答案 7 :(得分: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 " "

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