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

2024-09-30 01:19:18 发布

您现在位置: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

我没有遇到任何其他情况下的代码将无法工作。你知道吗


Tags: 字符串代码if情况findinitialfinalprint
2条回答

如果AGAG正好在GUGU之前,您的代码就不能工作。在对该输入进行第一次迭代之后,strand的值是

GUCACACAGACAGAUGUAGAGGUGUUGUGUAACCCGUAGAGCAAAGGCAACAGUGUGUAAAGAGGUGUAAAGAG

那么initial就是21final就是17,所以你要:

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

它只是将strand设置回相同的值,所以您会陷入循环中。你知道吗

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

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

您还可以使用regexp替换来完成整个过程:

import re
strand = re.sub(r'GUGU(.*?)AGAG', '', strand)
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

相关问题 更多 >

    热门问题