繁体   English   中英

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

[英]How to check if all words in the list are all caps in python

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

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

>>> 'FDSFS BBIBIFBIBWEF ASDASD 112,32:/'.isupper()    
True

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

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

所以我检查了all()包含的参数列表是什么:

>>> [word.isupper() for word in sent]
[True, True, True, False, False]

奇怪的是, isupper()返回False ,但如果这些字符串只包含一个大写字符,则返回True

>>> '123'.isupper()
False
>>> '123A'.isupper()
True
>>> '123?A'.isupper()
True
>>> '123?'.isupper()
False
>>> ''.isupper()
False

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

Q1:

文档中所述:

如果字符串中所有大小写字符都是大写且至少有一个大小写字符,则返回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))

Q2:

解决方案 1:

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

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

解决方案 2:

或者检查是否所有字符都不是小写的:

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

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

解决方案 3:

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

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

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

使用str.islower的否定:

sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
result = [(not word.islower()) for word in sent]
print(result)

Output

[True, True, True, True, True]

isupper 的行为在文档中有解释:

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

(强调我的)

一个大小写字符是:

大小写字符是那些具有一般类别属性的字符,它们是“Lu”(字母,大写)、“Ll”(字母,小写)或“Lt”(字母,titlecase)之一。

有关如何识别大小写字符的详细解释,请参见此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM