char python之间的大写

时间:2015-04-04 12:06:46

标签: python python-3.x uppercase

我需要帮助,如何在这两颗星之间获得大写。

INPUT:"S*t*a*r*s are every*where*"

输出:"STaRs are everyWHERE"

我的代码在这里:

def trans(s):
    x = ""
    a = False
    for j in range(len(s)):
        if s[j] == "*" or a:
            a = True
            if a:
                x += s[j].upper()
        else:
            x += s[j]
    return "".join(x.replace("*",""))

问题是我不知道循环回到False的位置。现在它只看到*并将所有内容都设为大写。

state machine

4 个答案:

答案 0 :(得分:5)

注意:其他答案可以很好地向您展示如何修复代码。这是另一种方法,一旦你学习了正则表达式,你就会发现它更容易。

您可以使用re.sub功能。

>>> s = "S*t*a*r*s are every*where*"
>>> re.sub(r'\*([^*]*)\*', lambda m: m.group(1).upper(), s)
'STaRs are everyWHERE'

在正则表达式中,*是一个特殊的元字符,它重复前一个标记零次或多次。为了匹配文字*,您需要在正则表达式中使用\*

所以\*([^*]*)\*正则表达式匹配每对*块,即(*t**r**where*)和中间字符(第1组捕获*中存在的字符。

对于每次匹配,re.sub函数会将匹配的*..*块替换为string-inside-*.upper()。即,它将upper()函数应用于*内的字符串,并将结果作为替换字符串返回。

答案 1 :(得分:4)

您需要切换您的州;每当您找到*时,反转函数的状态,以便在遍历文本时可以在大写和小写之间切换。

您可以使用not轻松完成此操作; not a如果是True,则返回False,反之亦然:

def trans(s):
    x = ""
    a = False
    for j in range(len(s)):
        if s[j] == "*":
            a = not a  # change state; false to true and true to false
            continue  # no need to add the star to the output
        if a:
            x += s[j].upper()
        else:
            x += s[j]
    return x

每次找到*个字符时,a都会被切换;通过在此时使用continue,您还可以阻止将*字符添加到输出中,因此可以完全避免replace()。对字符串的''.join()调用再次生成相同的字符串,在这种情况下不需要它。

你不需要range(),你可以直接循环s。你也可以使用更好的名字:

def trans(string):
    result = ""
    do_upper = False
    for character in string:
        if character == "*":
            do_upper = not do_upper  # change state; false to true and true to false
            continue  # no need to add the star to the output
        result += character.upper() if do_upper else character
    return result

演示:

>>> def trans(string):
...     result = ""
...     do_upper = False
...     for character in string:
...         if character == "*":
...             do_upper = not do_upper  # change state; false to true and true to false
...             continue  # no need to add the star to the output
...         result += character.upper() if do_upper else character
...     return result
... 
>>> trans('S*t*a*r*s are every*where*')
'STaRs are everyWHERE'

答案 2 :(得分:3)

这样想。每当您看到*时,您需要在上部和原始案例之间进行切换。所以,在代码中实现相同的功能,比如

def trans(s):
    x, flag = "", False

    # You can iterate the string object with `for`
    for char in s:

        # The current character is a `*`
        if char == "*":
            # flip the flag everytime you see a `*`.
            flag = not flag
            # Skip further processing, as the current character is `*`
            continue

        if flag:
            # If the flag is Truthy, we need to uppercase the string
            x += char.upper()
        else:
            # Otherwise add the character as it is to the result.
            x += char

    # no need to `join` and `replace`, as we already skipped `*`. So just return.
    return x

答案 3 :(得分:3)

a应在TrueFalse之间切换。您只需将其设置为True。也可以直接遍历字符串的字符而不是索引。并使用更全面的变量名称。如果您跳过' *'则不需要加入,也不需要替换。马上:

def trans(text):
    result = ""
    upper = False

    for char in text:
        if char == "*":
            upper = not upper
        elif upper:
            result += char.upper()
        else:
            result += char
    return result