我需要帮助,如何在这两颗星之间获得大写。
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
的位置。现在它只看到*
并将所有内容都设为大写。
答案 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
应在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