title()
方法工作得很好,但是我有一种情况,即字符串以单词和数字开头,我只想对字符串中不以数字开头的单词进行标题大写。
数字的数量可以是可变的,并且并不总是数字。以下是每种情况的示例。
"this is sparta".title() # This Is Sparta
"3rd sparta this is".title() # 3Rd Sparta This Is
"4545numbers start here".title() # "4545Numbers Start Here
我希望这些都改为:
"This Is Sparta"
"3rd Sparta This Is"
"4545numbers Start Here"
我正在使用一个不允许导入的程序,我需要在一行中完成此操作。我唯一能使用的库是re
。
如果可能的话,我更倾向于使用列表推导式。
事实证明,已经有一个函数可以做到这一点,string.capwords
:
>>> import string
>>> string.capwords('1st foo bar bor1ng baz')
'1st Foo Bar Bor1ng Baz'
>>> string.capwords("3rd sparta this is")
'3rd Sparta This Is'
需要注意的一点是:连续的空白将被折叠成一个空格,并且前导和尾随的空白将被删除。值得注意的是,这意味着您将丢失行分隔符。如果您希望保留这些内容,则应先将其分成几行。
注意,在内部,它实际上使用capitalize
方法而不是title
,但这似乎是您想要的。
下面是一个简单的列表推导式:
' '.join([word.capitalize() for word in your_string.split(' ')])
如果你想分割标点和其他空格,你可能必须使用某种re
函数
正则表达式解。
In [19]: re.sub(r'b(w+)b', lambda x: x.groups()[0].capitalize(), "3rd sparta this.is1", re.UNICODE)
Out[19]: '3rd Sparta This.Is1'
(参见re.sub的文档)
这可以是另一个选项:
s = "3rd sparta this is"
" ".join([si.title() if not (str.isdigit(si[0])) else si for si in s.split()])
只需将第一个字符设置为大写
string = string.split (' ')
for x in range (len(string)):
try:
string[x] = string[x][0].uppercase() + string [x][1:]
except ValueError:
pass
temp = ''
for word in string:
temp += word + ' '
string = temp
string.title()