如何在Python中检查列表中的所有单词是否全部大写

Mah*_*aha 4 python string list

我想知道列表中的所有单词是否全部大写,即所有字母字符都大写。

我尝试使用一个简单的字符串来理解以下行为isupper()

>>> 'FDSFS BBIBIFBIBWEF ASDASD 112,32:/'.isupper()    
True
Run Code Online (Sandbox Code Playgroud)

所以我把这句话中的单词分成了列表:

>>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
>>> all([word.isupper() for word in sent])
False
Run Code Online (Sandbox Code Playgroud)

所以我检查了参数列表包含的内容all()

>>> [word.isupper() for word in sent]
[True, True, True, False, False]
Run Code Online (Sandbox Code Playgroud)

奇怪的是,isupper()返回False不包含字母的字符串(仅由数字和特殊字符组成),但True如果这些字符串包含单个大写字符,则返回:

>>> '123'.isupper()
False
>>> '123A'.isupper()
True
>>> '123?A'.isupper()
True
>>> '123?'.isupper()
False
>>> ''.isupper()
False
Run Code Online (Sandbox Code Playgroud)

Q1. 这种行为背后是否有任何设计决策isupper()
Q2。我怎样才能以最Pythonic和最小的方式实现我想做的事情?(也许还有其他函数只检查输入字符串中的所有字母单词是否都是大写,根本不关心特殊字符、数字和空字符串?或者我是否必须从头开始编写一个?)

U10*_*ard 5

问题一:

正如文档中提到的:

True如果字符串中所有大小写字符均为大写且至少有一个大小写字符,则返回,否则返回False

正如您所看到的,它正在检查字符串中的所有字符是否都是大写,而不仅仅是字母。

这是一个类似的实现:

import string
def upper(s):
    notlower = all([word not in string.ascii_lowercase for word in s])
    anyupper = any([word in string.ascii_uppercase for word in s])
    return notlower and anyupper
print(upper(s))
Run Code Online (Sandbox Code Playgroud)

问题2:

解决方案一:

解决这个问题的方法可能是使用upper并检查它是否等于原始字符串:

>>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
>>> all([word.upper() == word for word in sent])
True
>>> 
Run Code Online (Sandbox Code Playgroud)

解决方案2:

或者检查是否没有字符是小写的:

>>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
>>> all([(not word.islower()) for word in sent])
True
>>> 
Run Code Online (Sandbox Code Playgroud)

刚刚意识到@DaniMesejo 发布了这个,归功于他。

解决方案3:

这也可以使用正则表达式非常优雅地完成:

>>> import re
>>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
>>> expr = re.compile('^[^a-z]*$')
>>> all(map(expr.search, sent))
True
>>> 
Run Code Online (Sandbox Code Playgroud)

使用map已编译的正则表达式,可能会更有效。