如何在字符串中查找大写字母并返回包含和不包含大写字母的单词列表
我的作业是“写一个程序,从用户那里读取一个字符串,并根据输入创建一个单词列表。创建两个列表,一个包含至少有一个大写字母的单词,另一个包含没有任何大写字母的单词。
使用一个循环来打印出包含大写字母的单词,然后是没有大写字母的单词,每行一个单词。”
我知道的内容是不正确的:
s= input("Enter your string: ")
words = sorted(s.strip().split())
for word in words:
print (word)
因为它只会在首字母是大写的情况下进行排序。其实在这个作业中,大写字母可以出现在单词的任何位置。
比如,'tHis is a sTring'
。
我在尝试一个看起来类似的解决方案,只是想看看能不能把包含大写字母的单词找出来……但就是没成功:
s = input("Please enter a sentence: ")
while True:
cap = 0
s = s.strip().split()
for c in s:
if c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
print(c[:cap])
cap += 1
else:
print("not the answer")
break
不过,使用正则表达式可能比写出整个字母表要更有效。
9 个回答
2
听起来用正则表达式来解决问题的第一部分会更简单(一个只查找大写字母[A-Z]的正则表达式就可以了)。
对于第二部分,我建议使用两个列表,这样在一个循环中打印所有内容会很方便。一个列表用来存放非大写字母的单词,另一个列表用来存放大写字母的单词。
所以,程序的基本步骤可以这样概括:
- 把字符串分割成一个单词数组。
- 对数组中的每个单词:如果正则表达式返回真,就把它加到大写字母列表中;否则,就加到非大写字母列表中。
- 先打印第一个列表中的每个单词,然后打印第二个列表中的单词。
我用伪代码写了这个,因为这是一个编程作业,所以你最好自己写出实际的代码。希望这对你有帮助!
6
提示:“创建两个列表”
s= input("Enter your string: ")
withcap = []
without = []
for word in s.strip().split():
# your turn
你使用的for .. else
的方式是错误的——else
块会在循环没有被break
中断时执行。你想要实现的逻辑大概是这样的
for c in s:
if c.isupper():
# s contains a capital letter
# <do something>
break # one such letter is enough
else: # we did't `break` out of the loop
# therefore have no capital letter in s
# <do something>
而且你可以用any
来写得更简洁
if any(c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" for c in s):
# <do something>
else:
# <do something>
13
>>> w = 'AbcDefgHijkL'
>>> r = re.findall('([A-Z])', word)
>>> r
['A', 'D', 'H', 'L']
这个方法可以让你得到一个单词里所有的大写字母……只是分享这个想法
>>> r = re.findall('([A-Z][a-z]+)', w)
>>> r
['Abc', 'Defg', 'Hijk']
上面的代码会让你得到所有以大写字母开头的单词。注意:最后一个没有被捕捉到,因为它不是一个完整的单词,但即使这样也可以捕捉到
>>> r = re.findall('([A-Z][a-z]*)', w)
>>> r
['Abc', 'Defg', 'Hijk', 'L']
如果在单词中找到了大写字母,这个方法会返回真(true):
>>> word = 'abcdD'
>>> bool(re.search('([A-Z])', word))