如何将string(Python)中每个单词的首字母大写?

s = 'the brown fox' 

在这里做点事

应该是:

 'The Brown Fox' 

什么是最简单的方法来做到这一点?

string的.title()方法(ASCII或Unicode是好的)是这样做的:

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

但是,如文档中所述,请注意带有embedded式撇号的string。

该algorithm使用简单的与语言无关的单词定义作为连续字母组。 这个定义在很多情况下都有效,但是这意味着收缩和占有者的撇号形成了单词边界,这可能不是理想的结果:

 >>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk" 

“标题”方法不能很好地工作,

 >>> "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不存在或无,则空白字符的运行被replace为单个空格,并且前导空格和尾随空格被删除,否则使用sep分割和连接单词。

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

拆分成单词,首先对拆分组中的每个单词进行封顶,然后重新join。 这将改变把单词分隔成单个空格的空白,不pipe它是什么。

 s = 'the brown fox' lst = [word[0].upper() + word[1:] for word in s.split()] s = " ".join(lst) 

编辑:我不记得当我写了上面的代码时,我在想什么,但没有必要build立一个明确的列表; 我们可以使用一个生成器expression式以懒惰的方式来完成它。 所以这是一个更好的解决scheme:

 s = 'the brown fox' s = ' '.join(word[0].upper() + word[1:] for word in s.split()) 

使用一个正则expression式来匹配string的开头,或空格分隔的单词,再加上一个非空白字符; 使用圆括号来标记“匹配组”。 编写一个带有匹配对象的函数,并以大写forms返回未改变的空白匹配组和非空白字符匹配组。 然后使用re.sub()来replace模式。 这个没有第一个解决scheme的标点符号问题,也没有像我的第一个解决scheme那样重做白色空间。 这一个产生最好的结果。

 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()可以采取一个function! 你可以在re.sub()做一些不重要的处理来产生最终结果!

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

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

如果str.title()不适合你,请自己做大写。

  1. 将string拆分成单词列表
  2. 大写每个单词的第一个字母
  3. 将单词join单个string中

一内胆:

 >>> ' '.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) 

当解决scheme简单而安全的时候,为什么使用连接和循环使生命复杂化?

只要这样做:

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

以下是不同方式的总结:

最简单的解决scheme是将句子拆分为单词,并将第一个字母大写,然后将其连接在一起。

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

如果您不想先将inputstring拆分为单词,并使用奇特的生成器:

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

或者不需要导入itertools

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

或者你可以使用steveha的答案中的正则expression式

 import re def cap_sentence(s): return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s) 

这些将用于所有这些input:

 "" => "" "abc" => "ABC" "foO baR" => "FoO BaR" "foo bar" => "Foo Bar" "foo's bar" => "Foo's Bar" "foo's1bar" => "Foo's1bar" "foo 1bar" => "Foo 1bar" 

现在,如果我们使用一个单词的定义作为句子的开头或任何空格之后的东西,那么这些是已发布的一些其他答案 ,以及它们不能按预期工作的input:

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

  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" 

使用''拆分将修复第二个输出,但capwords()仍然不会工作的第一个

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

小心多个空格

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

大写字母



 str =“这是string的例子....哇!

打印“str.title():”,str.title();

如果您访问[1:],空string将引发错误,因此我将使用:

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

只以大写字母的第一个字母。

正如Mark指出你应该使用.title()

 "MyAwesomeString".title() 

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

 {{ "MyAwesomeString"|title }} 

或使用一个variables:

 {{ myvar|title }} 

build议的方法str.title()在所有情况下都不起作用。 例如:

 string = "ab 3c" string.title() > "AB 3C" 

而不是"AB 3c"

我认为,最好是做这样的事情:

 def capitalize_words(string): words = string.split() return ' '.join([word.capitalize() for word in words]) capitalize_words(string) >'AB 3c' 

我真的很喜欢这个答案:

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

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

但是我发送的一些信息中,有一些空白的字符在尝试写入时会导致错误[1:]。 可能有更好的办法做到这一点,但我不得不添加一个如果len(s)> 0,如在

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