Python如何提取(^和^)之间的子串实现madlib填词游戏功能
MadLib填词游戏代码问题分析
你的代码遗漏了以下核心逻辑:
- 没有循环遍历所有占位符:
find()方法只会匹配第一个出现的(^和^),模板存在多个占位符时,只会处理第一个就终止运行,无法覆盖所有待填词位置。 - 替换逻辑错误:你仅替换了占位符中间的标识文本,替换完成后
(^和^)的包裹符号会保留,不符合输出要求;同时直接使用replace()做全局替换时,若模板存在多个相同的占位符标识,会一次性替换所有内容,无法支持用户为相同标识输入不同内容的需求。 - 状态未更新:你每次处理都基于最原始的输入模板
madlib,单次替换后的结果没有作为后续处理的基础文本,即使加了循环也无法持续处理剩余占位符。 - 边界情况未处理:当输入模板不存在占位符时,函数内的
if分支不会执行,mad变量未定义就返回,会直接抛出命名错误。 - 变量命名冲突:函数内定义的临时变量
mad和函数名重名,会导致后续无法正常调用函数。
修正后可运行的参考代码
# 读取模板文本 template = input("输入MadLib模板(占位符格式为(^标识^)):") a = "(^" b = "^)" current_text = template # 循环处理所有占位符 while a in current_text: # 定位当前第一个占位符的起止位置 start_idx = current_text.find(a) end_idx = current_text.find(b, start_idx) + len(b) # 提取占位符标识(去掉包裹符号) placeholder = current_text[start_idx + len(a) : end_idx - len(b)] # 读取用户输入 input_word = input(f"请输入{placeholder}:") # 替换整个占位符结构,更新当前文本,每次仅替换1个匹配项 current_text = current_text.replace(current_text[start_idx:end_idx], input_word, 1) # 输出最终结果 print("\n生成结果:") print(current_text)
内容的提问来源于stack exchange,提问作者wannabe coder
相关产品推荐
相关产品推荐

