【问题标题】:Python Regex Finding a Match That Starts Inside Previous match [duplicate]Python正则表达式查找从上一个匹配项开始的匹配项[重复]
【发布时间】:2021-01-16 16:22:59
【问题描述】:

我正在寻找python中字符串中所有子字符串的索引。我当前的正则表达式代码找不到在上一个匹配项中开始的匹配项。

我有一个字符串:s = r'GATATATGCATATACTT' 和一个子字符串 t = r'ATAT'。索引 1、3 和 9 处应该有匹配项。使用以下代码仅显示索引 1 和 9 处的匹配项,因为索引 3 在第一个匹配项中。如何让所有匹配项出现?

非常感谢!

import re

s= 'GATATATGCATATACTT'
t = r'ATAT'

pattern = re.compile(t)

[print(i) for i in pattern.finditer(s)]

【问题讨论】:

    标签: python regex genetics rosalind


    【解决方案1】:

    由于您有重叠匹配,您需要在前瞻中使用捕获组:(?=(YOUEXPR))

    import re
    
    s= 'GATATATGCATATACTT'
    t = r'(?=(ATAT))'
    
    pattern = re.compile(t)
    
    [print(i) for i in pattern.finditer(s)]
    

    输出:

    <re.Match object; span=(1, 1), match=''>
    <re.Match object; span=(3, 3), match=''>
    <re.Match object; span=(9, 9), match=''>
    

    或者:

    [print(i.start()) for i in pattern.finditer(s)]
    

    输出:

    1
    3
    9
    

    或者:

    import re
    
    s= 'GATATATGCATATACTT'
    t = 'ATAT'
    
    pattern = re.compile(f'(?=({t}))')
    
    print ([(i.start(), s[i.start():i.start()+len(t)]) for i in pattern.finditer(s)])
    

    输出:

    [(1, 'ATAT'), (3, 'ATAT'), (9, 'ATAT')]
    

    【讨论】:

    • 非常感谢!这非常有效。我仍然不完全理解正则表达式的环视部分,但我现在会阅读更多内容。
    【解决方案2】:

    如果您正在寻找位置,最好的选择是re.finditer

    import re 
    
    s = r'GATATATGCATATACTT'
    t = r'ATAT'
    
    >>> [m for m in re.finditer(rf'(?={t})', s)]
    [<re.Match object; span=(1, 1), match=''>, <re.Match object; span=(3, 3), match=''>, <re.Match object; span=(9, 9), match=''>]
    

    使用返回的match object,可以得到起始索引:

    >>> [m.start() for m in re.finditer(rf'(?={t})', s)]
    [1, 3, 9]
    

    你也可以在纯 Python 中找到重叠的子字符串:

    def find_overlaps(s, sub):
        start = 0
        while True:
            start = s.find(sub, start)
            if start == -1: return
            yield start
            start += 1
    
    >>> list(find_overlaps(s,t))
    [1, 3, 9]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多