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

