s = 'the brown fox'

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

S应为:

'The Brown Fox'

最简单的方法是什么?


当前回答

这里总结了不同的方法,以及一些需要注意的陷阱

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

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

Splitting the sentence into words and capitalizing the first letter then join it back together: # 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(' ')) Without splitting the string, checking blank spaces to find the start of a word def cap_sentence(s): return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) ) Or using generators: # 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)) ) Using regular expressions, from steveha's answer: # 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 () 返回s.title () #不需要的输出: "foO baR" => "foO baR" "foo's bar" => "foo's bar" "foo's1bar" => "foo's1bar" "foo 1bar" => "foo 1bar"


.capitalize()或.capwords() 返回' '.join(w.r esize () for s.split()中的w) #或 进口的字符串 返回string.capwords(年代) #不需要的输出: "foO baR" => "foO baR" "foo bar" => "foo bar" 使用' '作为分割将修复第二个输出,但不能修复第一个输出 返回' '.join(w.r esize () for w in s.s split(' ')) #或 进口的字符串 返回字符串。大写字符(s, ' ') #不需要的输出: "foO baR" => "foO baR"


.upper () 注意使用多个空格,这可以通过使用' '进行分割来修复(如答案顶部所示) 返回' ' . join (w [0] .upper () + w (1:) w s.split ()) #不需要的输出: "foo bar" => "foo bar"

其他回答

字符串的.title()方法(ASCII或Unicode都可以)这样做:

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

但是,请注意带有内嵌撇号的字符串,如文档中所述。

该算法使用一个简单的独立于语言的单词定义作为连续的字母组。这个定义在很多情况下都适用,但它意味着缩略词和所有格中的撇号形成了单词边界,这可能不是理想的结果: >>> "他们是比尔来自英国的朋友".title() “他们是比尔的英国朋友”

建议的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:],空字符串将引发错误。因此我会使用:

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

只大写第一个字母。

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

拆分为单词,从拆分的组中为每个单词加首字母大写,然后重新连接。这将把分隔单词的空白改为一个单独的空白,不管它是什么。

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

Use a regular expression to match the beginning of the string, or white space separating words, plus a single non-whitespace character; use parentheses to mark "match groups". Write a function that takes a match object, and returns the white space match group unchanged and the non-whitespace character match group in upper case. Then use re.sub() to replace the patterns. This one does not have the punctuation problems of the first solution, nor does it redo the white space like my first solution. This one produces the best result.

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()中进行非平凡的处理以产生最终结果!

另一个解决方案是:

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