代码之家  ›  专栏  ›  技术社区  ›  Skywalker

如何在python字符串中的子字符串之间找到子字符串?

  •  1
  • Skywalker  · 技术社区  · 6 年前

    让这根绳子 "AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT" . 我想找到AAAG和AGCT之间的字符串。

    我希望输出是 ["QWERTYUIOP","ZXCVBNM"] ,即字符串列表。

    我试过了

    def find_distances_between_motifs(positions1, positions2, motif_length1):
    diff1 = []
    diff2 = []
    pos2 = 0
    flag = 0
    for pos1 in range(len(positions1)):
        if pos2 >= len(positions2):
            break
        if flag == 1:
            flag = 0
            pos1 -= 1
        if positions2[pos2] - positions1[pos1] > 30:
            diff1.append(NaN)
            diff2.append(NaN)
            continue
        elif positions2[pos2] - positions1[pos1] < 1:
            pos2 += 1
            diff2.append(NaN)
            flag = 1
        elif pos1 < len(positions1) - 1 and positions1[pos1+1] > positions2[pos2]:
            diff1.append(positions[pos2] - positions[pos1] - motif_length1)
            diff2.append(pos2)
            pos2 += 1
        else:
            continue
    return diff1, diff2
    

    我想返回两个数组-一个是序列长度在基序之间的位置,第二个是第二个基序的位置,这将给出前面的距离。

    2 回复  |  直到 6 年前
        1
  •  7
  •   Rakesh    6 年前

    使用正则表达式。 re.findall 带lookback和Lookahead

    import re
    s = "AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT"
    print( re.findall(r"(?<=AAAG).*?(?=AGCT)", s))
    

    ['QWERTYUIOP', 'ZXCVBNM']
    
        2
  •  1
  •   Nouman ProfHase85    6 年前

    如果你不想使用正则表达式,那么我已经做了一个代码。这有点复杂,但如果你仔细看看,然后你就会明白。

    def addd(llist,word,word2):
        xx1 = sum([[i, word] for i in llist], [])[:-1]
        try:iii = xx1.index(word2);del xx1[iii]
        except:pass
        return xx1
    a,output = addd("AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT".split("AAAG"),"St4rT",""),[]
    for i,x in enumerate(a):
        if "AGCT" in x:
            output.append(addd(x.split("AGCT"),"3nD.",""))
        else:output.append(x)
    total = []
    for i in output:
        if isinstance(i,list):total+=i
        elif isinstance(i,str):total.append(i)
    output,typ = [],0
    for x,i in enumerate(total):
        if typ == 0 and i == "St4rT":
            try:output.append(total[x+1]);typ = 1
            except:pass
        elif typ == 1 and i == "3nD.":typ = 0
    print(output)
    

    ['QWERTYUIOP', 'ZXCVBNM']