以下是不同方式的总结:
最简单的解决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"