问题描述
我有这个活动,我必须在字符串中使用星形增长,它随着字符串中字符的数量增长。这是一个例子:star_match_growth("incandescent","c") 并让它返回为: inc*andesc**ent 并让它继续,如果字符串中有更多的 c。这就是我必须做的:
def star_match_growth(word,letter):
builder = ""
for i in range(0,len(word)):
word_2 = word.replace(letter,str(star_growth(word.count(letter))))
return word_2
def star_growth(top):
word = top * "*"
builder = ""
for i in range(1,len(word) + 1):
builder += word[0:i] + " "
return builder[:-1]
print(star_match_growth("incandescent","c"))
输出为:
inc* **andesc* **ent
注意它也必须忽略大小写 注意我也不允许将任何内容导入代码本身
解决方法
您可以为 re.sub
提供一个可调用的(函数、lambda 等),它必须接受单个正则表达式匹配对象作为参数,并且必须返回一个字符串来替换该匹配。在我的代码段中,我利用了一个持久性默认参数 it
,它是一个迭代器,它产生升序整数(在这种情况下从 1 开始)。迭代器的状态在调用之间保留,这会为后续匹配添加越来越多的星号:
def star_match_growth(string,pattern):
import re
from itertools import count
def replace(match,it=count(1)):
return match.group() + ("*" * next(it))
return re.sub(pattern,replace,string,flags=re.IGNORECASE)
print(star_match_growth("incandescent","C"))
输出:
inc*andesc**ent
>>>
编辑 - 不利用标准库,并使用生成字符(有时是星串)的生成器:
def star_match_growth(string,letter):
num_stars = 1
for char in string:
yield char
if char in {letter.lower(),letter.upper()}:
yield "*" * num_stars
num_stars += 1
print("".join(star_match_growth("incandescent","C")))