字符之间的大写 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
应在 True
和 False
之间切换。您只需将其设置为 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
我需要帮助如何在两颗星之间获得大写字母。
输入:"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
应在 True
和 False
之间切换。您只需将其设置为 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