Python实现移除所有指定起止子串间内容的技术问题
递归实现完全可行!
咱们先来拆解下你的需求:要移除所有begin和end之间的文本,而不是只处理第一次匹配。递归确实是个很合适的思路——本质上就是重复执行「找到匹配→移除中间内容→处理新字符串」这个流程,直到没有匹配为止。
先说说你当前代码的局限
你的现有逻辑只处理了第一次出现的begin和end对,没有循环或递归处理后续的匹配。比如示例中的"yes_and_no___yes_and_no",处理完第一次后得到"yesno___yes_and_no",但剩下的yes_and_no就没被处理了。
递归实现的思路
递归的核心是「把处理后的字符串作为新输入,再次调用函数」,具体步骤:
- 检查当前字符串中是否存在有效的
begin和end对(begin在end前面) - 如果存在,就像你之前那样截取
begin结束到end开始之间的内容,拼接成新字符串 - 递归调用函数处理这个新字符串,继续查找剩余的匹配
- 如果找不到有效匹配了,就返回当前字符串
修改后的递归代码
def extractFromString(baseStr, extStr1, extStr2): # 先处理空标记的边界情况,避免无效操作或无限递归 if not extStr1 or not extStr2: return baseStr # 找到extStr1的起始位置 start_idx = baseStr.find(extStr1) # 从extStr1结束的位置开始找extStr2,确保顺序正确 end_idx = baseStr.find(extStr2, start_idx + len(extStr1)) # 如果两个标记都存在且顺序合法 if start_idx != -1 and end_idx != -1: # 拼接:开头到extStr1结束的部分 + extStr2之后的部分 new_str = baseStr[:start_idx + len(extStr1)] + baseStr[end_idx:] # 递归处理新字符串,搞定剩下的匹配 return extractFromString(new_str, extStr1, extStr2) else: # 没有更多有效匹配了,返回结果 return baseStr
测试你的示例
调用extractFromString("yes_and_no___yes_and_no", "yes", "no"),会得到预期的"yesno___yesno"——递归会先处理第一个yes_and_no得到"yesno___yes_and_no",然后再次调用处理剩下的yes_and_no,最终得到目标结果。
额外注意点
- 一定要确保
end是在begin之后查找的(代码里用了find的第二个参数指定起始位置),否则会出现end在begin前面的无效匹配,导致错误结果 - 加入了空标记的判断,如果
begin或end是空字符串,直接返回原字符串,避免出现无限递归或逻辑错误
内容的提问来源于stack exchange,提问作者Oliver Southon
相关产品推荐
相关产品推荐

