为什么re.findall在查找字符串中的三元组项时没有具体说明.Python

所以我有四行代码

seq= 'ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA'



OR_0 = re.findall(r'ATG(?:...){9,}?(?:TAA|TAG|TGA)',seq)  

让我解释一下我首先要做什么. . .很抱歉,这令人困惑,但是我将尽力解释一下.

因此,我正在寻找以’ATG’开头的序列,其后为任何单词char [例如3 ‘GGG’,’GTT’,’TTA’等],直到遇到“ TAA”,“ TAG”或“ TGA”为止,我也希望它们的长度至少为30个字符. . .因此{9,}?

这在某种程度上可行,但是如果您随后发现ATG GAA GTT GGA TGA AAG TGG AGG TAA AGA GAA GAC GAT TGA

因此,在这种情况下,如果它以第一个“ ATG”开头并一直到下一个“ TAA”,“ TAG”或“ TGA”,就应该找到“ ATGGAAGTTGGATGA”

然而
当您运行OR_0代码行时,它会吐出整个seq字符串.我不知道如何仅考虑第一个“ TAA”,“ TAG”或“ TGA”,然后考虑第一个“ ATG”

如果以3为单位读取时“ ATG”后面紧跟另一个“ ATG”,那没关系,它不应重新开始,但是如果以3单位读取时遇到“ TAA”,“ TAG”或“ TGA”它应该停止.

我的问题是,为什么re.findall找到最长的序列’ATG’xxx-xxx-[‘TAA’,’TAG’或’TGA’]而不是第一次出现的’TAA’,’TAG’或’TGA’在以单词字符分隔的ATG之后,以3为单位?

再次致歉,如果这令人困惑,但由于我在此初始文本行的基础上弄乱了我拥有的多个数据集,我想找出原因

解决方法:

如果您希望您的正则表达式在第一个TAA | TAG | TGA处停止匹配,但仍然只有在至少有三个三个字母块的情况下才成功,以下内容可能会有所帮助:

>>> import re
>>> regexp = r'ATG(?:(?!TAA|TAG|TGA)...){9,}?(?:TAA|TAG|TGA)'
>>> re.findall(regexp, 'ATGAAAAAAAAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAAAAAAAAAAAAAAAAAAAAAAAAATAG']
>>> re.findall(regexp, 'ATGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAG']
>>> re.findall(regexp, 'ATGAAATAGAAAAAAAAAAAAAAAAAAAAATAG')
[]

这将使用负前瞻(?!TAA | TAG | TGA)来确保三个字符块在与三个字符块匹配之前不是TAA | TAG | TGA.

请注意,尽管TAA | TAG | TGA不会落在三个字符的边界上,仍然可以成功匹配:

>>> re.findall(regexp, 'ATGAAAATAGAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAATAGAAAAAAAAAAAAAAAAAAAATAG']
上一篇:正则


下一篇:初识正则表达式