5

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.

如果可能的话,我的偏好是使用列表推导来做到这一点。

4

5 回答 5

14

事实证明,已经有一个函数可以做到这一点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'

需要注意的一件事:空格的运行将被折叠成一个空格,并且前导和尾随空格将被删除。值得注意的是,这意味着您将丢失line separators。如果您想保留它们,您应该先分成几行。

请注意,在内部,它实际上使用capitalize方法而不是title,但这似乎是您想要的。

于 2015-08-28T22:43:53.430 回答
4

这是一个简单的列表理解:

' '.join([word.capitalize() for word in your_string.split(' ')])

如果您想拆分标点符号和其他空格,您可能必须使用某种re功能。

于 2015-08-28T22:37:19.667 回答
3

正则表达式解决方案。

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

于 2015-08-28T22:44:03.267 回答
1

这可能是另一种选择:

  s = "3rd sparta this is"
  " ".join([si.title() if not (str.isdigit(si[0])) else si for si in s.split()])
于 2015-08-28T22:37:21.493 回答
0

只需将第一个字符设置为大写即可

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()
于 2015-08-28T22:38:49.347 回答