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 上的文档)