本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.12节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.12 控制大小写
任务
将一个字符串由大写转成小写,或者反其道而行之。
解决方案
这正是字符串对象提供upper和lower方法的原因。每个方法都不需要参数,直接返回一个字符串的拷贝,其中的每个字母都被改变成大写形式—或小写形式:
big = little.upper( )
little = big.lower( )
非字母的字符按照原样被复制。
s.capitalize和s[:1].upper()+s[1:].lower()相似:第一个字符被改成大写,其余字符被转成小写。s.title也很相似,不过它将每个单词的第一个字母大写(这里的单词可以是字母的序列),其余部分则转成小写:
>>> print 'one tWo thrEe'.capitalize( )
One two three
>>> print 'one tWo thrEe'.title( )
One Two Three
讨论
操作字符串大小写是很常见的需求,有很多方法可以让你创建需要的字符串。另外,还可以检查一个字符串是否已经是满足需求的形式,比如isupper、islower和istitle方法,如果给定的字符串不是空的,至少含有一个字母,而且分别满足全部大写、全部小写、每个单词开头大写的条件,这三种方法都会返回一个True,但是却没有类似的iscapitalized方法。不过如果我们需要一个行为方式类似于“is…”的方法,自己编写代码也很简单。如果给定的字符串是空的,那些方法都会返回False。如果给定的字符串非空,但是却不包含任何字母字符,也将全部返回False。
最清楚简单的iscapitalized,仅需简洁的一行:
def iscapitalized(s):
return s == s.capitalize( )
不过,这偏离了“is…”方法们的行为模式,对于空字符串和不含字母的字符串,它也返回True。我们再给出一个严格点的版本:
import string
notrans = string.maketrans('', '') #identity''translation''
def containsAny(str, strset):
return len(strset) != len(strset.translate(notrans, str))
def iscapitalized(s):
return s == s.capitalize( ) and containsAny(s, string.letters)
这里,我们用了第1.8节中的函数来确保,当遇到了空字符串或不含字母的字符串,返回值是False。不过也正如第1.8节的提示一样,那意味着这个特别的iscapitalized只适用于普通字符串,对Unicode字符串不适用。