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

如何在Python中查找模式串在目标字符串中的所有起始位置

在Python中查找子串的所有起始位置

没问题,我来帮你搞定这个需求——找出strA里所有strB作为子串起始的位置,最终输出0 2 9对吧?下面给你两种实用的实现方法:

方法一:用字符串的find()方法循环查找

这是最基础直观的方式,不需要额外导入模块,适合简单的子串匹配场景:

strA = "ATATATGCGATAT"
strB = "ATAT"
positions = []
start_idx = 0

while True:
    # 从start_idx开始查找strB的位置
    current_pos = strA.find(strB, start_idx)
    # 如果找不到(返回-1)就退出循环
    if current_pos == -1:
        break
    positions.append(current_pos)
    # 下一次从当前位置的下一个字符开始找,避免重复匹配重叠的子串
    start_idx = current_pos + 1

# 把结果转成空格分隔的字符串输出
print(' '.join(map(str, positions)))

这段代码的逻辑很简单:每次用find()从指定起始点搜索子串,找到就记录位置,然后把下一次的搜索起点移到当前位置+1,直到找不到为止。运行后就能得到你想要的0 2 9。

方法二:用正则表达式的finditer()

如果以后需要处理更复杂的模式匹配,正则表达式会更灵活。这里我们可以用正向零宽断言来找到所有符合条件的起始位置:

import re

strA = "ATATATGCGATAT"
strB = "ATAT"
# 用正向预查(?=...)匹配所有后面跟着strB的位置
matches = re.finditer(f'(?={strB})', strA)
# 提取每个匹配的起始索引
positions = [match.start() for match in matches]

print(' '.join(map(str, positions)))

正向预查(?={strB})不会消耗字符串中的字符,所以能精准定位到所有strB开始的位置,包括像ATATAT这种重叠的情况,输出结果同样是0 2 9。

两种方法都能满足你的需求,你可以根据自己的场景选择——如果只是简单子串查找,方法一更轻便;如果涉及复杂模式,正则的扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:37:53