如何将字符串中每个单词的首字母大写?
s = 'the brown fox'
...在这里做一些事情...
s
应该是:
'The Brown Fox'
有什么简单的方法可以做到这一点吗?
24 个回答
因为这件事对我来说很有趣,所以我分享两个解决方案。
首先,把字符串分成单词,然后把每个单词的首字母大写,最后再把它们合并起来。这样做会把单词之间的空格变成一个单一的空格,不管原来是什么样的空格。
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
补充说明:我不记得当初写上面那段代码时在想什么,但其实不需要明确地创建一个列表;我们可以用生成器表达式来懒惰地处理。这是一个更好的解决方案:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
使用正则表达式来匹配字符串的开头,或者是单词之间的空格,再加上一个非空格字符;用括号标记“匹配组”。写一个函数,接收一个匹配对象,返回未改变的空格匹配组和大写的非空格字符匹配组。然后用 re.sub()
来替换这些模式。这个方法没有第一个解决方案中的标点符号问题,也不会像我第一个方案那样重新处理空格。这个方法的效果最好。
import re
s = 'the brown fox'
def repl_func(m):
"""process regular expression match groups for word upper-casing problem"""
return m.group(1) + m.group(2).upper()
s = re.sub("(^|\s)(\S)", repl_func, s)
>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"
我很高兴我研究了这个答案。我之前完全不知道 re.sub()
可以接受一个函数!你可以在 re.sub()
中进行复杂的处理,以得到最终结果!
这个 .title()
方法效果不太好,
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
可以试试 string.capwords()
方法,
import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
根据 Python 的文档,这个方法的工作原理是:
先把输入的内容分成一个个单词,使用 str.split() 方法来分割;然后把每个单词的首字母大写,使用 str.capitalize() 方法;最后再把这些大写的单词合并成一个字符串,使用 str.join() 方法。如果你没有提供第二个参数 sep,或者这个参数是 None,那么连续的空白字符会被替换成一个空格,开头和结尾的空白也会被去掉;如果提供了 sep,那么就用这个参数来分割和合并单词。
字符串的 .title()
方法可以把字符串中的每个单词的首字母变成大写(无论是ASCII还是Unicode都可以)。
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
不过,要注意那些包含撇号的字符串,文档里有提到这一点。
这个算法把一个单词定义为连续字母的组合,这个定义在很多情况下都适用。但这也意味着,撇号在缩写词和表示所有格的词中会被当作单词的分隔符,这可能不是你想要的效果:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"