我希望将子串的所有出现与python匹配。
我找到了this,但我希望匹配最多相隔一段距离的子串的出现(例如最多6个)。所以,如果我有字符串
AATCGTGCCGTGTGCCCCAAAATGAACGCGCCGCTGTG
如果两个TG分隔最多6个字符,我想得到TG的所有位置。
因此,在上面的示例中,我想获得[5, 10, 12, 34, 36]
。我不想要中间的TG位置,因为它离任何一个" group" (10个字符)。
我试过这个:
(?=TG(?:.+){1,6}?)
但它没有用。
修改的
我创建了正则表达式,返回我想要的所有位置,除了最后一个。
(?=TG.{0,6}TG)
如果我使用上面的示例,则返回的位置标有|
AATCG|TGCCG|TGTGCCCCAAAATGAACGCGCCGC|TGTG
但我也想获得标有\
AATCG|TGCCG|TG\TGCCCCAAAATGAACGCGCCGC|TG\TG
我知道它为什么不起作用,因为它匹配所有TG后跟0-6个随机字符和一个TG,但我无法理解我应该添加什么才能使它工作。
答案 0 :(得分:1)
如果使用正则表达式,我认为这应该有用 该位置必须从捕获组1的位置获得。
注意 - 我认为您的排名34
无效。
(?:^.*?|(?<=TG).{0,4})(TG)
修改:
你也可以通过这种方式来开始新的TG组。
使用\K
- 没有捕获组:(?:(?<=TG).{0,4}\KTG|.*?\KTG(?=.{0,4}TG))
格式化:
(?:
(?<= TG )
.{0,4}
\K
TG
|
.*?
\K
TG
(?= .{0,4} TG )
)
不使用分支重置 - 2个捕获组:(?:(?<=TG).{0,4}(TG)|.*?(TG)(?=.{0,4}TG))
格式化:
(?:
(?<= TG )
.{0,4}
( TG ) # (1)
|
.*?
( TG ) # (2)
(?= .{0,4} TG )
)
使用分支重置 - 1个捕获组:(?|(?<=TG).{0,4}(TG)|.*?(TG)(?=.{0,4}TG))
格式化:
(?|
(?<= TG )
.{0,4}
( TG ) # (1)
|
.*?
( TG ) # (1)
(?= .{0,4} TG )
)
答案 1 :(得分:1)
您可以执行以下操作,首先查找所有出现的内容,然后检查索引之间的距离:
text = AATCGTGCCGTGTGCCCCAAAATGAACGCGCCGCTGTG
positions = []
index = 0
# Get all positions
while index < len(text):
index = text.find('TG', index)
positions.append(index)
index += 2 # +2 because len('TG') == 2
# Filter out positions where distance are maximum 6
for i in range(1,len(positions)):
if(((positions[i] - positions[i-1]) > 6) and ((positions[i+1] - positions[i]) > 6)): # check distance in both directions
del positions[i]
# print resulting list
print positions
我还没有检查过,但它应该可以完成这项工作。