包含/排除捕获组影响搜索结果

Including / excluding capturing group affects search result

任务

在一个字符串中找到一个字符串的最长连续序列。

例如,给定 DNA 序列:AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC,找到最长的连续序列 AGATC

我尝试了什么

仅使用 search = re.findall(r'(AGATC)+', DNAsequence) returns me 具有 1 个连续序列的字符串,例如['AGATC', 'AGATC', 'AGATC', ...]

我发现我需要使用非捕获组 ?: 才能获得预期的输出。 search = re.findall(r'(?:AGATC)+', DNAsequence) returns 我是预期的 ['AGATC', 'AGATCAGATCAGATC', 'AGATC', ...]

我需要什么帮助

为什么我需要使用非捕获组表达式来获取多个连续序列? (AGATC)+ 本身不应该给出预期的输出吗?据我了解,是否使用捕获组也不应该影响搜索结果。

注意

这个问题与高度相关,但最上面的答案没有解释为什么必须在语法中使用非捕获组。我无法将我的问题添加为评论,所以我必须创建一个新的 post.

非捕获组是必要的,因为你的正则表达式模式指定了 AGATC 的重复,默认情况下会告诉 re.findall 到 return 匹配捕获组中出现的任何内容.为了进一步解释这一点,在 (AGATC)+ 中的捕获组将仅 return 在 最后一个 匹配超过一个 AGATC 的情况。这意味着 AGATC 是最长的匹配 return。通过关闭捕获组,它允许 re.findall 默认为 return 整个匹配,这就是你想要的。

seq = "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC"
matches = re.findall(r'(AGATC)+', seq)
print(matches)

这会打印:

['AGATC', 'AGATC']

但是,关闭捕获组:

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

这会打印:

['AGATCAGATC', 'AGATCAGATCAGATCAGATCAGATC']