如何将字符串中每个单词的首字母大写?

836 投票
24 回答
930969 浏览
提问于 2025-04-15 14:59
s = 'the brown fox'

...在这里做一些事情...

s 应该是:

'The Brown Fox'

有什么简单的方法可以做到这一点吗?

24 个回答

129

因为这件事对我来说很有趣,所以我分享两个解决方案。

首先,把字符串分成单词,然后把每个单词的首字母大写,最后再把它们合并起来。这样做会把单词之间的空格变成一个单一的空格,不管原来是什么样的空格。

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() 中进行复杂的处理,以得到最终结果!

269

这个 .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,那么就用这个参数来分割和合并单词。

1365

字符串的 .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"

撰写回答