我正在尝试创建一个简单的脚本,该脚本为指定的.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 " "
有帮助吗?
答案 0 :(得分:2)
其他人为您提供了多种执行任务的方法。我想解释一下为什么您的第一种方法无法按预期工作:
upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if word.rfind(upper):
.rfind
的 str
方法正在寻找ABCDEFGHIJKLMNOPQRSTUVWXYZ
内最后一个子串word
的位置。我猜您的单词中不包含这样的子字符串,在这种情况下,.rfind
返回-1
,根据Python的规则,它的值为True
(因为它不为零),因此它将捕获几乎所有单词(仅以0
开头且仅包含单个False
的单词会给出ABCDEFGHIJKLMNOPQRSTUVWXYZ
或ABCDEFGHIJKLMNOPQRSTUVWXYZ
)
答案 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)
您可以尝试使用reversed
和is_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 " "
请尝试使用上面的代码...如果不起作用,请在这里告诉我。