You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现移除所有指定起止子串间内容的技术问题

递归实现完全可行!

咱们先来拆解下你的需求:要移除所有begin和end之间的文本,而不是只处理第一次匹配。递归确实是个很合适的思路——本质上就是重复执行「找到匹配→移除中间内容→处理新字符串」这个流程,直到没有匹配为止。

先说说你当前代码的局限

你的现有逻辑只处理了第一次出现的begin和end对,没有循环或递归处理后续的匹配。比如示例中的"yes_and_no___yes_and_no",处理完第一次后得到"yesno___yes_and_no",但剩下的yes_and_no就没被处理了。

递归实现的思路

递归的核心是「把处理后的字符串作为新输入,再次调用函数」,具体步骤:

  1. 检查当前字符串中是否存在有效的begin和end对(begin在end前面)
  2. 如果存在,就像你之前那样截取begin结束到end开始之间的内容,拼接成新字符串
  3. 递归调用函数处理这个新字符串,继续查找剩余的匹配
  4. 如果找不到有效匹配了,就返回当前字符串

修改后的递归代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:42:26