大写功能的较短代码

时间:2017-02-25 08:58:14

标签: python python-3.x

我在这里解决了这个问题https://www.hackerrank.com/challenges/capitalize

描述: 给你一个字符串。你的任务是利用它的每个词。总之,只有第一个字符大写。示例12abc,当大写时仍然是12abc - 因为这个'标题'没有像#3; 1 w 2 r 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)

但是这段代码太麻烦了。有人可以帮助更优雅的pythonic决定吗?谢谢!

4 个答案:

答案 0 :(得分:5)

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,但它会赢得&#39}。 t为"abc(成为"Abc)执行此操作。

尽管\b很方便,但它确实意味着像"won't"这样的字符串将大写为"Won'T"。如果这是一个问题,可以使用更有针对性的选择器来在没有非空格字符的情况下进行大写:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以使用re模块

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())

输出:

# 1 W 2 R 3ga Hello World

positive look-behind (?<=[0-9])仅匹配在其前面有数字的字母字符([a-zA-Z])。通过这些匹配,我们使用.lower()方法来撤消&#39; .title()

的影响

答案 3 :(得分:1)

以下是不使用re模块的替代解决方案。

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