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
相关产品推荐
相关产品推荐

