我试图通过删除两个单词之间出现的段来打破一个字符串。
示例:
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
我还没有遇到任何其他代码无效的情况。
答案 0 :(得分:1)
如果AGAG
在GUGU
之前,您的代码无效。对该输入进行第一次迭代后,strand
的值为
GUCACACAGACAGAUGUAGAGGUGUUGUGUAACCCGUAGAGCAAAGGCAACAGUGUGUAAAGAGGUGUAAAGAG
然后initial
为21
而final
为17
,您可以:
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