gpt4 book ai didi

python - 匹配字符串中不是特定字符的连续片段的部分

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:03 26 4
gpt4 key购买 nike

我有一个简单的函数,它从一个字符串中生成至少有 gapSize 个连续 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)

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

我已经研究了 lookarounds 并尝试了

(?!N{25,}).*

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

编辑:例如:一个序列 NNNNNNACTGACGTNNNACTGACNNNNNN 应该匹配 ACTGACGTNNNACTGAC gapSize=5 和 ACTGACGT & ACTGAC gapSize = 3。

最佳答案

所以这是一个正则表达式解决方案,它似乎是您想要的,但我想知道是否真的有更好的方法来实现它。当我想到它们时,我会添加替代方案。我使用了几种在线正则表达式工具并在 shell 中进行了尝试。

One of the tools有一个很好的正则表达式图形和生成 SO 答案的工具代码:正则表达式(间隙为 10)是:

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

Regular expression visualization

用法:

s = 'NAANANNNNNNNNNNBBBBNNNCCNNNNNNNNNNDDDDN'
def foo(s, gapSize = 25):
'''yields non-gap items (re.match objects) in s or
if gaps are not present raises StopIteration immediately
'''
# beginning of string and followed by a 'gap' OR
# preceded a 'gap' and followed by a 'gap' OR
# preceded a 'gap' and followed by end of string
pattern = r'^.*?(?=N{{{}}})|(?<=N{{{}}})[^N].*?(?=N{{{}}})|(?<=N{{{}}})[^N].*?$'
pattern = pattern.format(gapSize, gapSize, gapSize, gapSize)
for match in re.finditer(pattern, s):
#yield match.span()
yield match

for match in foo(s, 10):
print match.span(), match.group()

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

因此,如果您稍微考虑一下,就会发现间隙 的开始是非间隙 的结束,反之亦然。因此,使用一个简单的正则表达式:遍历间隙,向循环添加逻辑以跟踪非间隙 跨度,并产生 跨度。 (我的占位符变量名可能会得到改进)

s = 'NAANANNNNNNNNNNBBBBNNNCCNNNNNNNNNNDDDDN'
def bar(s, n):
'''Yields the span of non-gap items in s or
immediately raises StopIteration if gaps are not present.
'''
gap = r'N{{{},}}'.format(n)
# initialize the placeholders
previous_start = 0
end = len(s)
for match in re.finditer(gap, s):
start, end = match.span()
if start == 0:
previous_start = end
continue
end = start
yield previous_start, end
previous_start = match.end()
if end != len(s):
yield previous_start, len(s)

用法

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

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

关于python - 匹配字符串中不是特定字符的连续片段的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com