【问题标题】:Including / excluding capturing group affects search result [duplicate]包括/排除捕获组会影响搜索结果[重复]
【发布时间】:2020-10-20 07:04:55
【问题描述】:

任务

在字符串中查找最长的连续序列。

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

我尝试了什么

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

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

我需要什么帮助

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

注意

这个问题与How to catch the longest sequence of a group 高度相关,但是上面的答案并没有解释为什么非捕获组必须在语法中使用。我无法将我的问题添加为评论,所以我必须创建一个新帖子。

【问题讨论】:

    标签: python regex cs50


    【解决方案1】:

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

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

    打印出来:

    ['AGATC', 'AGATC']
    

    但是,关闭捕获组:

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

    打印出来:

    ['AGATCAGATC', 'AGATCAGATCAGATCAGATCAGATC']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多