Python 大写函数的较短代码

Python 大写函数的较短代码,python,python-3.x,Python,Python 3.x,我在这里解决了这个问题 说明: 给你一个字符串。你的任务是把它的每个字都大写。在一个单词中,只有第一个字符是大写的。示例12abc大写时仍为12abc-因为此“title”不能正确处理像“1w 2r 3g”这样的字符串。 我需要检查数字和小写字母的组合。这是我的代码: def capitalize(string): result = list (string.title()) for index in range (len (string)-1): if string

我在这里解决了这个问题

说明: 给你一个字符串。你的任务是把它的每个字都大写。在一个单词中,只有第一个字符是大写的。示例12abc大写时仍为12abc-因为此“title”不能正确处理像“1w 2r 3g”这样的字符串。 我需要检查数字和小写字母的组合。这是我的代码:

def capitalize(string):
    result = list (string.title())
    for index in range (len (string)-1):
      if string[index].isdigit () and string[index+1].islower ():
        result[index+1] = result[index+1].lower()
    result = ''.join([char for char in result])
    return (result)

但是这个代码太麻烦了。有人能帮我做一个更优雅的蟒蛇式的决定吗?谢谢

您可以使用
re
模块

' '.join([x.capitalize() for x in s.split(' ')])
import re

someStr = '1 w 2 r 3ga hello world'
re.sub(r"(?<=[0-9])[a-zA-Z]", lambda m: m.group(0).lower(), someStr.title())

(?模块
re
可以在这里提供帮助:

titlesub = re.compile(r'\b[a-zA-Z]').sub  # Precompile regex and prebind method for efficiency  
def capitalize(string):
    return titlesub(lambda x: x.group(0).upper(), string)
注意:
\b
处理单词/非单词字符边界(单词字符为字母数字和下划线),因此它将阻止
12abc
a
大写,但不会对
“abc
(变成
”abc
)这样做

虽然
\b
很方便,但它确实意味着像
“不会”
这样的字符串将被大写为
“不会”
。如果这是一个问题,当前面没有非空格字符时,可以使用更有针对性的选择器来大写:

titlesub = re.compile(r'(?<!\S)[a-zA-Z]').sub

titlesub=re.compile(r')(?这里是一个不使用
re
模块的替代解决方案

def capitalize(string):
    result = []
    for word in string.split():
        result.append(word[0].upper() + word[1:].lower())
    return (' '.join(result)) 

注意:不处理非空格空格(例如制表符).同意。您的答案是首选。我尝试了使用正则表达式的两种方法,以及使用join的列表理解,它们的得分都是20/20。因为练习上说-字符串由字母数字字符和空格组成。因此不需要处理特殊字符,如
\t
\n
。啊,忘了word边界!是的,我认为这将适用于更多的情况!在下面的句子中,
“一旦它们被创建,它们就不能被更改。”
,可能输出正确
,一旦它们被创建,它们就不能被更改。
?@J.Piquard:Yar,整个问题很棘手。使用反向查找排除非空格字符可能会导致错误更好地理解“单词”的定义:
titlesub=re.compile(r'(?如果有两个或更多)连续空格,结果将不相关,我们将保留所有空格。输入'1W2R3g'时,其输出为'1W2R3g',丢失两个空格。哼,在您的示例
'1W2R3g'
中,我得到的字符串长度与
'1W2R3g'
相同(前后10个字母).没错。还有其他测试用例,包括多个空格。你看到我关于@ShadowRanger答案的问题了吗?我还不熟悉正则表达式,它在我的待办事项列表中)
def capitalize(string):
    result = []
    for word in string.split():
        result.append(word[0].upper() + word[1:].lower())
    return (' '.join(result))