在字符串中使用带有字母的 Star Growth

问题描述

我有这个活动,我必须在字符串中使用星形增长,它随着字符串中字符的数量增长。这是一个例子: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")))