使用关键字多次拼接一个字符串

时间:2018-05-09 22:50:14

标签: python

我试图通过删除两个单词之间出现的段来打破一个字符串。

示例:

AGCGUGUGAGAGCUCCGA

我将删除发生在:GUGU和AGAG之间的部分

因此,新字符串将是:

AGCCUCCGA

我写了一个代码,利用while循环来保持'拼接'一遍又一遍的字符串直到它无法在字符串中找到GUGU和AGAG。大多数时候,这个过程都有效。

我遇到了一个输入'是非常长的,然后我的代码陷入无限循环,我不明白为什么会这样。

我希望有人能够对其进行审核并帮助我改进我正在做的事情。

def splice(strand):
    while True:
        initial = strand.find('GUGU')
        final = strand.find('AGAG')
        if initial == -1:
            break
        if final == -1:
            break
        strand = strand[:initial] + strand[final+4:]
    return strand

if __name__ == "__main__":
    strand = input("Input strand: ")
    print()
    spliced = splice(strand)
    print("Output is {}".format(spliced))

失败的情况是:

GUGUAGAGGUCACAGUGUAAAAGCUCUAGAGCAGACAGAUGUAGAGGUGUUGUGUAACCCGUAGAGCAAAGGCAACAGUGUGUAAAGAGGUGUAAAGAG

预期结果:

GUCACACAGACAGAUGUAGAGCAAAGGCAACA

我还没有遇到任何其他代码无效的情况。

2 个答案:

答案 0 :(得分:1)

如果AGAGGUGU之前,您的代码无效。对该输入进行第一次迭代后,strand的值为

GUCACACAGACAGAUGUAGAGGUGUUGUGUAACCCGUAGAGCAAAGGCAACAGUGUGUAAAGAGGUGUAAAGAG

然后initial21final17,您可以:

strand = strand[:21] + strand[21:]

只是将strand设置回相同的值,因此您会陷入循环。

string.find()方法有一个可选的start参数,因此您可以告诉它在AGAG之后开始寻找initial

final = strand.find("AGAG", initial+4)

您也可以使用正则表达式替换来完成整个事情:

import re
strand = re.sub(r'GUGU(.*?)AGAG', '', strand)

答案 1 :(得分:0)

import re
pattern = '(.*?)GUGU.*?AGAG'
s1 = 'AGCGUGUGAGAGCUCCGA'
s2 = 'GUGUAGAGGUCACAGUGUAAAAGCUCUAGAGCAGACAGAUGUAGAGGUGUUGUGUAACCCGUAGAGCAAAGGCAACAGUGUGUAAAGAGGUGUAAAGAG'
print ''.join(re.findall(pattern,s1)) + s1[s1.rfind('AGAG')+4:]
print ''.join(re.findall(pattern,s2)) + s2[s2.rfind('AGAG')+4:]
  

AGCCUCCGA
  GUCACACAGACAGAUGUAGAGCAAAGGCAACA