匹配字符串中不是某些ch的连续延伸的部分

2024-06-16 17:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的函数,它从一个字符串中产生至少连续N的所有延伸:

def get_gap_coordinates(sequence, gapSize=25):
    gapPattern = "N{"+str(gapSize)+",}"
    p = re.compile(gapPattern)
    m = p.finditer(sequence)
    for gap in m:
        start,stop = gap.span()
        yield(start,stop)

现在我想要一个完全相反的函数:匹配所有不连续的字符(至少是gapsizen)。这些延伸可以出现在字符串中任何位置(开始、中间和结尾),任何给定的数字。在

我已经调查过周围的情况并试过了

^{pr2}$

但这不能满足我的需要。 非常感谢任何帮助!在

编辑: 例如:序列nnnnnn actgacgtnnnactgacnnn with应匹配gapSize=5的ACTGACGTNNNACTGAC和gapSize=3的ACTGACGT&ACTGAC。在


Tags: 函数字符串regetdefstartstopsequence
3条回答

我想用regex直接匹配想要的块,但是没有想到什么好东西。我认为最好是不断地寻找间隙,并简单地使用间隙坐标来获得好的块坐标。我是说,它们基本上是一样的,对吧?间隙限位器是块启动,间隙启动是块停止。在

def get_block_coordinates(sequence, gapSize=25):
    gapPattern = "N{"+str(gapSize)+",}"
    p = re.compile(gapPattern)
    m = p.finditer(sequence)
    prevStop = 0
    for gap in m:
        start,stop = gap.span()
        if start:
            yield(prevStop,start)
        prevStop = stop
    if prevStop < len(sequence):
        yield(prevStop,len(sequence))

消极展望似乎可以工作。E、 g.对于间隙尺寸3,regexp为:

N{3,}?([^N](?:(?!N{3,}?).)*) 

试试看here。在

^{pr2}$

警告:如果字符串不是以“N”序列开头,则在字符串开头可能不匹配。但是你总是可以用间隔大小乘以左边的N来填充字符串。在

所以这里有一个regex解决方案,它似乎是您想要的,但我想知道是否有更好的方法来实现它。我会在提出备选方案时添加它们。我使用了几个在线regex工具以及在shell中玩。在

One of the tools有一个很好的正则表达式图形和生成工具,因此答案code:regex(间隔为10)是:

^.*?(?=N{10})|(?<=N{10})[^N].*?(?=N{10})|(?<=N{10})[^N].*?$

Regular expression visualization

用法:

^{pr2}$

所以如果你仔细想想,你会发现一个间隙的开始是一个非间隙的结束,反之亦然。因此,使用一个简单的regex:迭代间隙,向循环添加逻辑以跟踪非gap跨距和yield跨距。(我的占位符变量名可能需要改进)

^{3}$

使用

for start, end in bar(s, 4):
    print (start, end), s[start:end]

'''
>>>
(0, 5) NAANA
(15, 24) BBBBNNNCC
(34, 39) DDDDN
>>>
''' 

相关问题 更多 >