Python: 除了以数字开头的字符串外,是否有一行脚本来处理首字母大写的字符串?
Python: Is there a one line script to title case strings except for strings that start with a digit?
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
.
如果可能的话,我的偏好是使用列表理解来做到这一点。
这是一个简单的列表理解:
' '.join([word.capitalize() for word in your_string.split(' ')])
如果您想根据标点符号和其他空格进行拆分,您可能必须使用某种 re
函数。
这可能是另一种选择:
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()
事实证明,已经有一个函数可以做到这一点,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'
需要注意的一件事:白色space 的运行将被折叠成单个 space,并且前导和尾随的白色space 将被删除。值得注意的是,这意味着您将失去 行分隔符 。如果你想保留那些,你应该先分成几行。
请注意,在内部,它实际上使用 capitalize
方法而不是 title
,但这似乎是您想要的。
正则表达式解决方案。
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 上的文档)
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
.
如果可能的话,我的偏好是使用列表理解来做到这一点。
这是一个简单的列表理解:
' '.join([word.capitalize() for word in your_string.split(' ')])
如果您想根据标点符号和其他空格进行拆分,您可能必须使用某种 re
函数。
这可能是另一种选择:
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()
事实证明,已经有一个函数可以做到这一点,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'
需要注意的一件事:白色space 的运行将被折叠成单个 space,并且前导和尾随的白色space 将被删除。值得注意的是,这意味着您将失去 行分隔符 。如果你想保留那些,你应该先分成几行。
请注意,在内部,它实际上使用 capitalize
方法而不是 title
,但这似乎是您想要的。
正则表达式解决方案。
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 上的文档)