字符之间的大写 python

Upper case between a char python

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

输入:"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。现在它只看到 * 并将所有内容变为大写。

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

您可以使用 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() 函数,并将结果 return 作为替换字符串。

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

您可以使用 not 最轻松地做到这一点; not a 会 return 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'

这样想。每当您看到 * 时,您需要在大写和原始大小写之间交替。所以,在代码中实现相同的,像这样

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

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