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

Checkio平台Python函数求助:查找指定标记间子串遇阻

解决Checkio中between_markers函数的常见问题

我刚帮几个朋友排查过这个Checkio的关卡,刚好熟悉这个需求。咱们先把问题拆解清楚:这个函数需要返回text中位于begin标记结束位置到end标记起始位置之间的子串,还要处理几种容易忽略的边界情况。

先列几个你可能踩坑的地方,对照看看是不是中招了:

  • 忘记跳过begin标记本身:比如你用text.find(begin)得到的是标记的起始索引,直接从这里开始取的话,会把begin也包含进去,正确的做法应该是加上len(begin)。
  • 没处理标记不存在的情况:如果begin不存在,应该从文本开头开始取;如果end不存在,应该取到文本结尾。用find()的话,找不到会返回-1,刚好可以利用这个判断。
  • 忽略了end在begin之前的情况:比如text="abcenddefbegin",这时候两个标记顺序反了,应该返回空字符串。
  • 误用index()替代find():index()在找不到标记时会抛出异常,而Checkio的测试用例肯定包含这种边界情况,所以必须用find()来安全处理。

接下来给你一个能覆盖所有情况的实现思路,你可以对比自己的代码找差异:

def between_markers(text: str, begin: str, end: str) -> str:
    # 找到begin标记的结束位置
    start_idx = text.find(begin)
    if start_idx != -1:
        start_idx += len(begin)
    else:
        start_idx = 0  # 没有begin标记,从开头开始
    
    # 找到end标记的起始位置
    end_idx = text.find(end)
    if end_idx == -1:
        end_idx = len(text)  # 没有end标记,取到结尾
    
    # 如果end在begin前面,返回空串
    if end_idx <= start_idx:
        return ""
    
    return text[start_idx:end_idx]

咱们来验证几个典型测试场景:

  • 常规情况:text="Hello [world]!", begin="[", end="]" → 返回world
  • 没有begin标记:text="Hello world!", begin="xxx", end="!" → 返回Hello world
  • 没有end标记:text="Hello [world", begin="[", end="xxx" → 返回world
  • 标记顺序反了:text="endbegin", begin="begin", end="end" → 返回""

你可以把自己的代码和这个思路对比,看看是哪个边界情况没处理到,或者索引计算错了。

内容的提问来源于stack exchange,提问作者user3637423

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:32:31