使用re.sub的python捕获组

使用re.sub的python捕获组,python,regex,Python,Regex,我需要使用正则表达式将字符串中每个单词的第一个字母大写: >>> import re >>> re.sub(r"\b(\S)", (r"\1").upper(), "foo bar") 'foo bar' 我希望结果是“foobar” 我尝试了title方法和string.capwords,但都存在如下问题: >>> import string >>> string.capwords("foo bar 1a

我需要使用正则表达式将字符串中每个单词的第一个字母大写:

>>> import re
>>> re.sub(r"\b(\S)", (r"\1").upper(), "foo bar")
'foo bar'
我希望结果是“foobar”

我尝试了title方法和string.capwords,但都存在如下问题:

>>> import string
>>> string.capwords("foo      bar   1a   ") 
'Foo Bar 1a'
>>> "1a".title() 
1A

在下面的评论中使用@Sebastian建议的lambda表达式对我来说很有用

如果您正在寻找正则表达式解决方案,
re.sub
函数可以作为第二个参数接收函数:

>>> def t(x):                        
...    if x:                        
...        return x.group(0).upper()

>>> re.sub(r"\b(\S)", t, "foo bar") 
'Foo Bar'                       

>>> re.sub(r"\b(\S)", t, "1foo bar")
'1foo Bar'                      

这似乎也行得通:

import string
' '.join([string.capitalize(word) for word in 'foo      bar   1a   '.split(' ')])
输出:

'Foo      Bar   1a   '

有必要使用正则表达式吗?你能用“foo-bar.title()”吗?可能是我试过的重复,但当第一个字符是数字时,title似乎不起作用。例如,我希望“1a”保持不变,但“1a”.title()返回“1a”@WesDoyle@ana并尝试
string.capwords
而不是您可以使用函数/lambda进行替换,例如
re.sub(r”\b(\S)”,lambda x:x.group().upper(),“foo bar”)