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

开发含通配符的搜索函数时,字符串切片循环移除字符失效求助

通配符搜索函数的字符移除问题解决

你的问题出在正序删除字符时的索引偏移:当你从前往后删除apusana的字符时,每删一个字符,后面的字符都会往前挪一位,导致后续的索引不再对应原单词的正确位置。比如原单词是"testi",要删索引1和3,第一次删1后变成"tsti",再用原索引3去删,实际删的是原单词的第4个字符(i),而不是原本要删的第3个字符(s)。

快速修复:倒序删除索引

把处理apusana的循环改成倒序遍历indeksit,从最大的索引开始删,这样前面的索引不会受后面删除操作的影响:

if "." in hakusana:
    indeksit = []
    while hakusana.count(".") > 0:
        i = hakusana.index(".")
        hakusana = hakusana[:i] + hakusana[i + 1:]
        indeksit.append(i + len(indeksit))
    for sana in sanalista:
        if len(hakusana) + len(indeksit) == len(sana):
            apusana = sana
            # 倒序遍历索引,避免删除后索引偏移
            for i in reversed(indeksit):
                apusana = apusana[:i] + apusana[i + 1:]
            if apusana == hakusana:
                osumat.append(sana)

更简洁的写法:直接字符对比

其实完全不需要先删除字符再匹配,直接逐个对比搜索词和单词的字符,遇到通配符"."就跳过检查,逻辑更清晰也更高效:

osumat = []
for sana in sanalista:
    # 长度不一致直接跳过
    if len(sana) != len(hakusana):
        continue
    # 逐个字符对比
    match_ok = True
    for h_c, s_c in zip(hakusana, sana):
        if h_c != "." and h_c != s_c:
            match_ok = False
            break
    if match_ok:
        osumat.append(sana)

这种写法不需要处理索引删除的问题,直接判断每个位置的字符是否符合要求,完全规避了索引偏移的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:52:52