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

How can I capitalize the first letter of each word in a string?

提问人:TIMEX 提问时间:10/11/2009 最后编辑:Peter MortensenTIMEX 更新时间:2/27/2023 访问量:901482

问:

s = 'the brown fox'

...在这里做点什么...

s应为:

'The Brown Fox'

最简单的方法是什么?

python capitalization capitalize

评论


答:

1343赞 Mark Rushakoff 10/11/2009 #1

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

评论

85赞 krethika 4/23/2013
我避免了诸如此类的所有格问题" ".join(w.capitalize() for w in s.split())
5赞 8/29/2014
这对大多数字符串来说并不安全,因为每个单词,甚至是所有格,都会被大写。
17赞 Soerendip 11/12/2016
string.title() 有问题。例如,当您使用 时,所需的结果将是 。但是,返回 ."e g 3b""E G 3b""e g 3b".title()"E G 3B"
13赞 Jonas Libbrecht 11/14/2016
请记住,这也会导致这种情况:In [2]: 'tEst'.title() Out[2]: 'Test'
7赞 Aaron3468 3/22/2018
很好的答案和评论强调,在 python 中,并非所有事情都按照您需要的方式运行,但总有方便的方法可以做到这一点。最方便的方法通常是导入专用库,例如 python-titlecase
128赞 steveha 10/11/2009 #2

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

拆分为单词,对拆分组中的每个单词进行首字母大写,然后重新加入。这将更改将单词分隔为单个空白的空白,无论它是什么。

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

评论

3赞 TomNysetvold 5/23/2012
+1 表示使用切片的解决方案。我需要一些可以在不改变其余单词大写的情况下将第一个字母大写的东西(例如,Foo 变成 foo,但 FOO 变成 fOO)。这太完美了。
3赞 Vanuan 12/2/2012
capitalize 返回其第一个字符大写,其余字符小写
1赞 steveha 12/3/2012
@Vanuan,你是对的!文档字符串描述让我认为它所做的只是将第一个字母大写,但您对它的实际作用是正确的。我会编辑答案。谢谢你的提醒。
1赞 Adrian Keister 10/12/2019
根据陈厚武回答中的文件,这似乎是事实。string.capwords
2赞 manpikin 2/4/2020
在上面的答案中需要注意的一点是,我认为最好使用 s.split(' '),而不是使用 s.split()。这是因为如果字符串有一些双倍空格,并且您希望在连接时保留这些双倍空格,s.plit(' ') 将帮助您维护空格,而 s.split() 不会
11赞 jibberia 10/11/2009 #3

如果 str.title() 不适合您,请自行进行大写。

  1. 将字符串拆分为单词列表
  2. 将每个单词的第一个字母大写
  3. 将单词联接到一个字符串中

单行:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

明确示例:

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)

评论

1赞 mklauber 10/18/2011
此解决方案的一个优点是,您会丢失任何特殊的空格。根据上下文,可能并不重要。
0赞 Nathan 11/3/2020
值得指出的是,如果大写的句子或单词集包含单个字符单词,例如“a”或“I”,则此操作将失败。
17赞 Konstantin Spirin 4/4/2012 #4

@jibberia anwser 的复制粘贴就绪版本:

def capitalize(line):
    return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))

评论

2赞 warvariuc 1/27/2015
无需构建列表。 接受生成器。str.join
0赞 Konstantin Spirin 1/28/2015
@warvariuc您将如何更改此代码以利用生成器?
1赞 warvariuc 1/28/2015
只需删除方括号,就像在这里完成的那样
1赞 Bhargav Rao 8/26/2016
虽然@warvariuc完美地提到了接受 gen exps,但在 特别是的情况下,通常最好使用列表推导。这是因为对参数进行两次迭代,因此提供现成的列表而不是生成器更快。joinstr.joinjoin
1赞 warvariuc 8/27/2016
@BhargavRao为什么需要对参数进行两次迭代呢?我刚刚检查了一下 - 它没有。虽然对于小序列,列表理解确实更快。str.join
261赞 Chen Houwu 9/9/2012 #5

.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 文档中关于 capwords 的内容:

使用 str.split() 将参数拆分为单词,使用 str.capitalize() 将每个单词大写,并使用 str.join() 连接大写的单词。如果缺少可选的第二个参数 sep 或 None,则空格字符的运行将替换为单个空格,并删除前导和尾随空格,否则 sep 将用于拆分和连接单词。

评论

5赞 devonbleibtrey 3/26/2016
Capwords 仍然缺乏,并且不处理诸如 .在此示例中,除 之外的所有世界都按预期大写。结果是"There once was a string with an 'that had words right after it and then closed'"that"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
3赞 houcros 9/20/2016
尽管如此,这比正常情况效果更好。在我的情况下,在正确处理时,为带有重音或重音的名称返回错误的输出。title()title()capwords()
5赞 Jonath P 11/17/2018
很好,但它仍然搞砸了“英国/英国”的区别
3赞 h0r53 6/11/2020
@Chen 后吴,英国/英国就是一个完美的反例。如何防止 Python 使用类似的方法将现有的大写字母小写?
-2赞 user1475777 11/11/2013 #6

我真的很喜欢这个答案:

@jibberia anwser 的复制粘贴就绪版本:

def capitalize(line):
    return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])

但是我发送的一些行拆分了一些空白的“”字符,这些字符在尝试执行 s[1:] 时会导致错误。可能有更好的方法可以做到这一点,但我不得不添加一个 if len(s)>0,如

return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])

评论

2赞 8/29/2014
这太复杂了,你甚至去检查长度?!低 效。
2赞 Tejas Tank 1/29/2014 #7

要将单词大写...

str = "this is string example....  wow!!!";
print "str.title() : ", str.title();

@Gary02127评论,以下解决方案适用于带撇号的标题

import re

def titlecase(s):
    return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)

text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))

评论

0赞 Tejas Tank 7/26/2016
使用现有函数可在 python 中快速执行。
0赞 GaryMBloom 12/23/2017
我不是很喜欢 title(),因为它不处理撇号。“我不能说”.title() 给出“我不能说”
0赞 Tejas Tank 12/30/2017
@Gary02127我有更新的答案,请看一下,也与您的问题域完美配合
6赞 chuckfinley 3/16/2014 #8

正如 Mark 所指出的,你应该使用 .title():

"MyAwesomeString".title()

但是,如果想在 Django 模板中将第一个字母大写,你可以使用这个:

{{ "MyAwesomeString"|title }}

或者使用变量:

{{ myvar|title }}
17赞 user3717756 8/29/2014 #9

当解决方案简单且安全时,为什么您会使用联接和 for 循环使您的生活复杂化??

只需这样做:

string = "the brown fox"
string[0].upper()+string[1:]

评论

4赞 Arnaud 11/18/2015
因为可以有几个词。
2赞 CoderGuy123 11/11/2016
是的,但通常我只想将第一个字母大写。这是一种做到这一点的方法。
2赞 luckydonald 12/10/2016
那你不就用吗?"the brown fox".capitalize()
4赞 janek37 4/11/2017
@luckydonald因为也许我不想变成.'this is John''This is john'
0赞 Hassan Baig 7/19/2018
这不是一个更好的方法(本质上是呼应@luckydonald)string.capitalize()
4赞 Soerendip 11/12/2016 #10

建议的方法 str.title() 并非在所有情况下都有效。 例如:

string = "a b 3c"
string.title()
> "A B 3C"

而不是。"A B 3c"

我认为,最好这样做:

def capitalize_words(string):
    words = string.split(" ") # just change the split(" ") method
    return ' '.join([word.capitalize() for word in words])

capitalize_words(string)
>'A B 3c'

评论

1赞 Divakar Rajesh 9/17/2018
但是,如果分隔它们的空格数不是 1,则可能会出现错误。供参考:hackerrank 问题
0赞 Soerendip 3/3/2023
我试了一下结果是string = "a b 3c"'A B 3c'
48赞 aljgom 2/28/2017 #11

以下是不同方法的摘要,以及一些需要注意的陷阱

它们将适用于所有这些输入:

""           => ""       
"a b c"      => "A B C"             
"foO baR"    => "FoO BaR"      
"foo    bar" => "Foo    Bar"   
"foo's bar"  => "Foo's Bar"    
"foo's1bar"  => "Foo's1bar"    
"foo 1bar"   => "Foo 1bar"     
  • 将句子拆分为单词并将第一个字母大写,然后将其重新连接在一起

     # Be careful with multiple spaces, and empty strings
     # for empty words w[0] would cause an index error, 
     # but with w[:1] we get an empty string as desired
     def cap_sentence(s):
       return ' '.join(w[:1].upper() + w[1:] for w in s.split(' '))
    
  • 在不拆分字符串的情况下,检查空格以查找单词的开头

      def cap_sentence(s):
        return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )
    
  • 使用生成器

      # Iterate through each of the characters in the string 
      # and capitalize the first char and any char after a blank space
      from itertools import chain 
      def cap_sentence(s):
        return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )
    
  • 使用正则表达式,来自 steveha 的回答

      # match the beginning of the string or a space, followed by a non-space
      import re
      def cap_sentence(s):
        return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)
    

现在,这些是发布的其他一些答案,以及如果我们将一个单词定义为句子的开头或空格后面的任何内容,它们将无法按预期工作的输入:

  • .title()

      return s.title()
    
    # Undesired outputs: 
    "foO baR"    => "Foo Bar"     
    "foo's bar"  => "Foo'S Bar"   
    "foo's1bar"  => "Foo'S1Bar"       
    "foo 1bar"   => "Foo 1Bar"        
    

  • .capitalize().capwords()

      return ' '.join(w.capitalize() for w in s.split())    
    # or
      import string
      return string.capwords(s)
    
    # Undesired outputs:
    "foO baR"    => "Foo Bar"      
    "foo    bar" => "Foo Bar"      
    

    用于拆分将修复第二个输出,但不会修复第一个输出' '

      return ' '.join(w.capitalize() for w in s.split(' '))    
    # or
      import string
      return string.capwords(s, ' ')
    
    # Undesired outputs:
    "foO baR"    => "Foo Bar"      
    

  • .upper()

    小心使用多个空格,这可以通过用于拆分来修复(如答案顶部所示)' '

      return ' '.join(w[0].upper() + w[1:] for w in s.split())
    # Undesired outputs:
    "foo    bar" => "Foo Bar"                 
    

评论

2赞 ProGrammer 1/7/2018
+1 表示全面摘要。我正在寻找一种方法,只在数字后面大写一个单词(不是每个单词)。你能在你的答案中补充一下来证明这一点吗?例如 应该返回 ,其中 是大写的,因为它跟在一个数字后面。我知道它超出了 OP 问题的范围,但对您已经广泛的答案来说是一个很好的补充。提前致谢。lower 123 upperlower 123 Upperupper
1赞 aljgom 1/8/2018
在这种情况下,您可以修改上述一些方法以满足您的需求。但是,我不会将其添加为答案的一部分,因为它不是大多数人正在寻找的。我会使用正则表达式版本,并使用代替(匹配一个或多个数字,后跟一个或多个空格,以及后面的任何字符),或者如果您想在数字后面的“零个或多个”空格之后将字符大写"([0-9]+)(\s+.)""(^|\s)(\S)""([0-9]+)(\s*.)"
1赞 ProGrammer 1/9/2018
我一定会研究它,这让我想到了另一个特殊情况:您将如何修改上面的片段以采用字符串,例如 和 output 而不是 .看到缩写的问题了吗?你愿意添加一些东西来证明这个案例吗?我一直在想这个问题,想不出办法。WW1 - the great warWW1 - The Great WarWw1 ...
1赞 aljgom 1/10/2018
上面提到的第一种方法不会更改输入字符串中已经大写的字母,因此输出为WW1WW1
2赞 Boris 7/26/2021
非常感谢,我一直在寻找可以以这种方式解决这个问题的东西,非常好的答案,一切都很好地解释了“参数 fooR”返回为“参数 FooR”现在我终于可以停止破坏我的小指了,因为shift键来自未来的欢呼声
9赞 Wim Feijen 5/17/2017 #12

如果访问 [1:],空字符串将引发错误。因此,我会使用:

def my_uppercase(title):
    if not title:
       return ''
    return title[0].upper() + title[1:]

仅将第一个字母大写。

评论

1赞 Eugene Pakhomov 11/8/2017
这不就是目的吗?str.capitalize
4赞 Wim Feijen 12/12/2017
@Eugene,是的,但不幸的是,将所有其他可能不受欢迎的字母大写。:/
1赞 aljgom 1/8/2018
return title[:1].upper() + title[1:]也会解决这个问题,因为像这样切开空字符串会得到 2 个空字符串,连接在一起形成一个返回的空字符串
1赞 GaryMBloom 11/25/2017 #13

不要忽视留白。如果你想处理,你得到而不是,你已经破坏了你的空白。上述某些解决方案将丢失空格。这是一个适用于 Python 2 和 3 并保留空白的解决方案。'fred flinstone''Fred Flinstone''Fred Flinstone'

def propercase(s):
    return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
12赞 Zahran 2/5/2018 #14

如果你只想要第一个字母:

>>> 'hello world'.capitalize()
'Hello world'

但要将每个单词大写:

>>> 'hello world'.title()
'Hello World'

评论

4赞 user2314737 2/16/2020
小心,因为是'hello New York'.capitalize()'Hello new york'
-1赞 Fuad Fouad 3/14/2018 #15

如果您想缩小尺寸

# Assuming you are opening a new file
with open(input_file) as file:
    lines = [x for x in reader(file) if x]

# for loop to parse the file by line
for line in lines:
    name = [x.strip().lower() for x in line if x]
    print(name) # Check the result
7赞 Amit Gupta 10/16/2019 #16

尽管所有答案都已经令人满意,但我会尝试涵盖两个额外的案例以及之前的所有案例。

如果空间不均匀,并且您想保持相同

string = hello    world i  am    here.

如果所有字符串都不是从字母开始的

string = 1 w 2 r 3g

在这里你可以使用它:

def solve(s):
    a = s.split(' ')
    for i in range(len(a)):
        a[i]= a[i].capitalize()
    return ' '.join(a)

这将为您提供:

output = Hello    World I  Am    Here
output = 1 W 2 R 3g

评论

2赞 manpikin 2/4/2020
感谢您强调非均匀空间的情况。上面的一些答案使用 s.split() 而不是 s.split(' ')。需要注意的是,对于非均匀空间,使用 s.split(' ') 将确保保持非均匀空间!再次感谢
0赞 Amresh Giri 4/22/2020
这完全适用于空格不均匀的单词或以某个数字开头的单词。谢谢:)
0赞 PADYMKO 12/31/2019 #17

一个适用于 Python 3 的快速函数

Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]
>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))
Помните своих Предковъ. Сражайся за Правду и Справедливость!
>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))
Хай живе вільна Україна! Хай живе Любовь поміж нас.
>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))
Faith and Labour make Dreams come true.

评论

0赞 aljgom 3/12/2022
这个答案只把句子的第一个字母大写。要求将句子中每个单词的首字母大写的问题
0赞 manpikin 2/4/2020 #18

使用非均匀空格将字符串大写

我想补充一下古普塔@Amit非均匀空间的观点:

从最初的问题开始,我们想将字符串中的每个单词大写。如果字符串具有不均匀的空格怎么办?s = 'the brown fox's = 'the brown fox'

def solve(s):
    # If you want to maintain the spaces in the string, s = 'the brown      fox'
    # Use s.split(' ') instead of s.split().
    # s.split() returns ['the', 'brown', 'fox']
    # while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']
    capitalized_word_list = [word.capitalize() for word in s.split(' ')]
    return ' '.join(capitalized_word_list)

评论

0赞 ZF007 3/26/2020
..如果您的代码在 Brown 和 Fox 之间没有空格,则无法补偿选项卡;-)
0赞 Nandini Ashok Tuptewar 11/7/2020 #19

您的问题最简单的解决方案,它适用于我的情况:

import string
def solve(s):
    return string.capwords(s,' ') 
    
s=input()
res=solve(s)
print(res)
2赞 Augustine Jose 1/14/2021 #20

.title() 方法不适用于所有测试用例,因此同时使用 .capitalize()、.replace() 和 .split() 是将每个单词的第一个字母大写的最佳选择。

例如:def caps(y):

     k=y.split()
     for i in k:
        y=y.replace(i,i.capitalize())
     return y
2赞 Omar 7/9/2021 #21

你可以试试这个。简单而整洁。

def cap_each(string):
    list_of_words = string.split(" ")

    for word in list_of_words:
        list_of_words[list_of_words.index(word)] = word.capitalize()

    return " ".join(list_of_words)
0赞 JonathanLoscalzo 2/11/2022 #22

另一个单行解决方案可能是:

" ".join(map(lambda d: d.capitalize(), word.split(' ')))

评论

0赞 Jeremy Caney 2/15/2022
这个问题目前有 21 个答案,包括一个投票最多、被接受的答案,票数超过 1200 票。你确定你的解决方案还没有给出吗?如果不是,为什么你认为你的方法比现有的提案有所改进,这些提案已经得到了社区的验证?在 Stack Overflow 上提供解释总是有用的,但当问题得到解决并让 OP 和社区都满意时,这一点尤其重要。通过解释您的答案有什么不同之处以及何时可能首选来帮助读者。
0赞 JonathanLoscalzo 2/17/2022
对不起@JeremyCaney但我在另一条评论中没有看到这个解决方案。虽然,我认为这个网站在答案上有 2 个选项:投票或不投票。如果您觉得我的解决方案没有用,请取消投票。但是,再一次,我认为这个平台是用于共享解决方案的,在这种情况下,IMO是一个简单的问题的简单解决方案。我不知道如果还有其他几个好的解决方案,它可能不会出现另一个。
0赞 JonathanLoscalzo 2/17/2022
@JeremyCaney 我找到了一些类似的答案:链接。恭喜!在这种情况下,他使用的是正则表达式,而我正在使用space character
0赞 JonathanLoscalzo 2/18/2022
我不知道为什么我有幸被你讲课。因为,这是一个需要简单解决方案的简单问题。我不知道为什么我收到了这个建议,而没有其他人。但无论如何,谢谢
1赞 Jeremy Caney 3/8/2022
我在“低质量答案”审查队列中发现了您的帖子,这是帖子被标记为不是答案的地方,或者绊倒了某些自动启发式方法(例如,基于长度、缺乏解释等)。你的回答似乎有效,我确实投票保留了它。但我也想确保你有关于如何改进它的反馈。作为 Stack Overflow 的使用者,查找包含许多纯代码答案的问题可能会让人不知所措,因此解释为什么一种方法与其他答案不同(如果不是更可取的话)非常有用。
2赞 Haris 12/27/2022 #23

您可以在 Python 中使用 method 将字符串中的每个单词大写:title()

string = "this is a test string"
capitalized_string = string.title()
print(capitalized_string)

输出:

This Is A Test String
6赞 Erick Mamberger 2/27/2023 #24

如果您将使用 .title() 方法,那么 ' 后面的字母也将变为大写。喜欢这个:

>>> "hello world's".title()
"Hello World'S"

为避免这种情况,请使用字符串库中的 capwords 函数。 喜欢这个:

>>> import string
>>> string.capwords("hello world's")
"Hello World's"