如何捕捉组中最长的序列

2024-10-04 11:22:44 发布

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

任务是找到组中最长的序列

例如,给定的DNA序列:"AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC" 它有7次发生AGATC(AGATC)匹配所有发生的事件。 是否可以编写只捕获最长序列的正则表达式,即给定文本中的AGATCAGATCAGATCAGATCAGATC? 如果仅使用正则表达式无法实现这一点,那么如何在python中迭代每个序列(即第一个序列是AGATCAGATC,第二个序列是AGATCAGATCAGATCAGATCAGATC等等)


Tags: 文本事件序列dnaagatcagatcagatcagatcagatcttttttctaatgtctaggatatatcagatcagatcagatcagatcagatcagatcagatcagatcagatcagatc
3条回答

核心问题是,“是否有可能编写只捕获最长序列的正则表达式?”答案是“是”:

import re

s = 'AGATC_AGATCAGATC_AGATCAGATCAGATC_AGATC_AGATCAGATC'

m = re.search(r'((?:AGATC)+)(?!.*\1)', s)
print m.group() if m else ''
  #=> "AGATCAGATCAGATC"

Regex demo<“\(ツ) /'>;Python demo

Python的正则表达式引擎执行以下操作

(            begin capture group 1
  (?:AGATC)  match 'AGATC' in a non-capture group
  +          execute the non-capture group 1+ times
)            end capture group 1
(?!          begin a negative lookahead
  .*         match 0+ characters
  \1         match the content of capture group 1
)            end the negative lookahead

对于上面的字符串s,将首先匹配AGATC,但负前瞻将发现AGATCAGATCAGATC的第一部分,因此将拒绝临时匹配。然后AGATCAGATC将被匹配,但负前瞻将发现AGATCAGATCAGATCAGATCAGATC的第一部分因此,这个临时匹配也将被拒绝。接下来,将匹配并接受AGATCAGATCAGATC,因为反向前瞻将不会在字符串的后面找到该匹配。(re.findallre.search不同,它还将匹配字符串末尾的AGATCAGATC。)

如果使用了re.findall,则在最长的匹配之后可能会有多个匹配(请参见regex演示链接中的最后一个测试字符串),但匹配的长度从第一个到最后一个都不会减少。因此,使用re.search获得的第一个匹配是最长的匹配

使用:

import re

sequence = "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC"
matches = re.findall(r'(?:AGATC)+', sequence)

# To find the longest subsequence
longest = max(matches, key=len)

说明:

非捕获组(?:AGATC)+

  • +量词-尽可能多地在一次和无限次之间匹配
  • AGATC按字面意思匹配字符AGATC(区分大小写)

结果:

# print(matches)
['AGATCAGATC', 'AGATCAGATCAGATCAGATCAGATC']

# print(longest)
'AGATCAGATCAGATCAGATCAGATC'

您可以测试regex^{}

使用re.finditer()迭代所有匹配项。然后使用max()和键函数查找最长的。使其成为一个函数,以便可以使用不同的组

import re

def find_longest(sequence, group):
    # build pattern
    pattern = fr"(?:{group})+"

    # iterate over all matches
    matches = (match[0] for match in re.finditer(pattern, sequence))

    # find the longest
    return max(matches, key=len)

seq = "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC"

find_longest(seq, "AGATC")

相关问题 更多 >