在处理大写字符串时无法正确处理

时间:2016-09-07 14:22:19

标签: string python-2.7

#!/usr/bin/python
# -*- coding: utf-8 -*-
def to_weird_case(string):
    lines = string.split()
    new_word = ''
    new_line = ''
    for word in lines:
        for item in word:
            if word.index(item) %2 ==0:
                item = item.upper()
                new_word += item
            else:
                new_word += item
        new_line = new_word +' '
    return new_line
print to_weird_case('what do you mean')

我想获得WhAt Do YoU MeAn,而不是WhAtDoYoUMeAn。我已经添加了行new_line = new_word +' '。我的问题在哪里?

2 个答案:

答案 0 :(得分:2)

首先,每次迭代都会覆盖new_line。其次,new_word变得越来越长,因为你从来没有"清楚"它。第三,在整个的末尾添加空格new_line,而不是在每个新单词之后(因为第二)。

查看评论

def to_weird_case(string):
    lines = string.split()
    new_line = ''
    for word in lines:
        new_word = '' # start new word from an empty string
        for item in word:
            if word.index(item) %2 ==0:
                item = item.upper()
                new_word += item
            else:
                new_word += item
        print new_word
        new_line = new_line + new_word + " " # add new word to the existing new line 
    return new_line

答案 1 :(得分:1)

你的代码没有重置new_word的值并且你在循环中覆盖了new_line这是正确的,但是我想分享下一个单行解决方案正则表达式:

import re
def to_weird_case(string):
    return re.sub(r'(\S)(\S?)', lambda m: "{0}{1}".format(m.group(1).upper(), m.group(2)), string);
print to_weird_case('what do you mean')

请参阅Python demo

(\S)(\S?)正则表达式将非空白捕获到组1中,将一个或零个非空白捕获到组2中,然后,在re.sub内,将组1值替换为大写的对应值

查看(\S)(\S?)what do you mean

的匹配情况
  • wh为匹配,w位于第1组,h位于第2组(enter image description here)。匹配作为m传递给lambda表达式,组1被修改,而组2只是按原样传递。
  • 下一场比赛包含at,同样的事情发生在群组
  • 接下来,空格不匹配,因为\S匹配任何字符,只有空格。
  • do匹配,同样的事情发生如上所述
  • 空格,yo如上所述进行匹配和处理
  • 接下来会匹配
  • u + 空格,因为第二个\S有一个?量词,可以匹配它修改的模式的一次或零次出现。因此,第一个char是大写的,第二个空字符串按原样使用。
  • 然后以类似的方式处理其余部分。