协慌网

登录 贡献 社区

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

s = 'the brown fox'

... 在这里做某事...

s应该是:

'The Brown Fox'

最简单的方法是什么?

答案

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

.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"

有关 capwords 的 Python 文档中

使用 str.split()将自变量拆分为单词,使用 str.capitalize()将每个单词大写,然后使用 str.join()将大写的单词连接起来。如果不存在可选的第二个参数 sep 或 “无”,则将空格字符替换为单个空格,并删除前导和尾随空格,否则将使用 sep 拆分和合并单词。

仅仅因为这种事情对我来说很有趣,所以这里有另外两个解决方案。

拆分为单词,对拆分组中的每个单词进行大写,然后重新加入。不管它是什么,这都会将将单词分隔的空白变为单个空白。

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())

使用正则表达式匹配字符串的开头,或使用空格分隔单词,再加上一个非空格字符;用括号标记 “匹配组”。编写一个函数,该函数接受一个 match 对象,并以大写形式返回空白的空白匹配组和非空白的字符匹配组。然后使用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()进行非平凡的处理以产生最终结果!