s = 'the brown fox'
......在这里做点什么......
s
应该是:
'The Brown Fox'
最简单的方法是什么?
答案 0 :(得分:822)
字符串的.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"
答案 1 :(得分:170)
.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"
使用str.split()将参数拆分为单词,使用str.capitalize()对每个单词进行大写,并使用str.join()连接大写单词。如果可选的第二个参数sep不存在或者None,则用空格字符替换单个空格,并删除前导和尾部空格,否则使用sep来拆分和连接单词。
答案 2 :(得分:92)
仅仅因为这种事情对我来说很有趣,这里还有两个解决方案。
分成单词,从分组中初始化每个单词,然后重新加入。这将改变将单词分隔成单个空白区域的空白区域,无论它是什么。
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 :(得分:14)
@jibberia anwser的复制粘贴就绪版本:
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
答案 4 :(得分:13)
以下是不同方法的摘要,它们适用于所有这些输入:
"" => ""
"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(' '))
- 如果您不想先将输入字符串拆分为单词,并使用花式生成器:
# 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'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)
现在,这些是已发布的一些其他答案,如果我们使用单词的定义作为句子的开头或之后的任何内容,则输入不能按预期工作一个空白区域:
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"
答案 5 :(得分:11)
为什么当解决方案简单安全时,你的生活会因为连接和循环而复杂化?
这样做:
string = "the brown fox"
string[0].upper()+string[1:]
答案 6 :(得分:10)
如果str.title()不适合您,请自行进行大写。
一衬垫:
>>> ' '.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)
答案 7 :(得分:5)
如果您访问[1:],空字符串将引发错误,因此我会使用:
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
仅限大写第一个字母。
答案 8 :(得分:3)
正如马克指出你应该使用.title()
:
"MyAwesomeString".title()
但是,如果想在django模板中使第一个字母大写,可以使用:
{{ "MyAwesomeString"|title }}
或使用变量:
{{ myvar|title }}
答案 9 :(得分:2)
将词汇大写......
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))
答案 10 :(得分:2)
建议的方法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'
答案 11 :(得分:1)
不要忽视白色空间的保护。如果您要处理'fred flinstone'
并获得'Fred Flinstone'
而不是'Fred Flinstone'
,则表示您的空白区域已损坏。上述一些解决方案将失去空白区域。这是一个对Python 2和3有用的解决方案,可以保留空白区域。
def propercase(s):
return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
答案 12 :(得分:1)
如果只想要第一个字母: 'hello world'.capitalize() 输出: 你好世界
但是为了把每个词都大写: 'hello world'.title() 输出: 你好世界
答案 13 :(得分:0)
**如果您想缩小尺寸**
#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
答案 14 :(得分:0)
一种快速功能适用于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.
答案 15 :(得分:0)
使用不统一的空格大写字符串
我想添加到@Amit Gupta的非均匀空间点:
从原始问题开始,我们想将字符串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)
答案 16 :(得分:0)
.title() 方法不适用于所有测试用例,因此将 .capitalize()、.replace() 和 .split() 一起使用是将每个单词的首字母大写的最佳选择。>
例如:def caps(y):
k=y.split()
for i in k:
y=y.replace(i,i.capitalize())
return y
答案 17 :(得分:0)
你可以试试这个。简单整洁。
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)
答案 18 :(得分:-1)
尽管所有答案都已经令人满意,但我将尝试覆盖所有2个额外的情况以及以前的所有情况。
如果空格不统一并且您要保持相同
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
我希望这不是多余的。
答案 19 :(得分:-1)
最简单的解决方案,对我而言有效:
import string
def solve(s):
return string.capwords(s,' ')
s=input()
res=solve(s)
print(res)
答案 20 :(得分:-2)
我真的很喜欢这个答案:
@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])