查找以python分隔的最大距离的子串的所有出现

时间:2015-12-06 19:42:46

标签: python regex

我希望将子串的所有出现与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,但我无法理解我应该添加什么才能使它工作。

2 个答案:

答案 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

我还没有检查过,但它应该可以完成这项工作。