包含/排除捕获组影响搜索结果
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']
任务
在一个字符串中找到一个字符串的最长连续序列。
例如,给定 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)+
本身不应该给出预期的输出吗?据我了解,是否使用捕获组也不应该影响搜索结果。
注意
这个问题与
非捕获组是必要的,因为你的正则表达式模式指定了 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']