匹配和索引所有子字符串,包括重叠的

Posted

技术标签:

【中文标题】匹配和索引所有子字符串,包括重叠的【英文标题】:Match and index all substrings, including overlapping ones 【发布时间】:2015-05-13 23:24:46 【问题描述】:

我正在尝试使用new regex findall 为匹配项编制索引,以便可以考虑重叠匹配项。但是,我只能找到匹配项,但无法正确给出它们的位置。

我的代码:

import regex as re
seq = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
xx=re.findall(substring,seq,overlapped=True)
print xx

xx 看起来像

['GTTTGCAG', 'GTTTGCAG']

因为在 10-17 和 25-32 位置有两场比赛。

但是,请问我怎样才能获得这些数字?通过检查 dir(xx),我没有可以在这个新函数中使用的 start/end/pos。 (我尝试了 xx.index(substring),但这似乎只给出了结果列表的索引:例如在这种情况下为 0 和 1)

谢谢。

【问题讨论】:

【参考方案1】:

使用re.finditer,可以获得起始位置:

import re
seq = "blahblahblahLALALAblahblahLALA"
substring="LALA"
lenss=len(substring)
overlapsearch="(?=(\\"+substring+"))"
xx=[[x.start(),x.start()+lenss] for x in list(re.finditer(overlapsearch,seq))]
check=[seq[x[0]:x[1]] for x in xx]
print xx
print check

结果:

[[12, 16], [14, 18], [26, 30]]
['LALA', 'LALA', 'LALA']

使用原始示例的结果:

[[9, 17], [24, 32]]
['GTTTGCAG', 'GTTTGCAG']

在子字符串搜索中添加“?=”告诉正则表达式下一个匹配可以使用上一个匹配中的字符

【讨论】:

Hackishly 修复了重叠问题,我认为 ;)【参考方案2】:

如果您不使用正则表达式,则可以使用可选的 start 参数重复调用 string.find()

例如:

sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"

def find_endpoints(seq, sub):
    off = 0
    matches = []
    while True:
        idx = seq.find(substring, off)
        if idx == -1: break
        matches.append((idx, idx+len(sub)))
        off = idx + 1
    return matches

for (s,e) in find_endpoints(sequence, substring):
    print(s, e, sequence[s:e])

输出:

(9, 17, 'GTTTGCAG')
(24, 32, 'GTTTGCAG')

注意:(s,e) 是子字符串的开始索引(包括)和结束索引(不包括)。

【讨论】:

谢谢@jedwards。感谢您的帮助。【参考方案3】:

这对长度等于模式长度的子字符串进行迭代,并与我们的模式进行比较。如果它们相同,它会记住字符串中的开始和结束索引。它是简单的列表理解。

sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring = "GTTTGCAG"

def find_indexes(seq, sub):
    return [(sub, i, len(sub)+i) for i in range(0, len(seq), 1) if seq[i:len(sub)+i] == sub]

print find_indexes(sequence, substring)

输出:

[('GTTTGCAG', 9, 17), ('GTTTGCAG', 24, 32)]

【讨论】:

解释可能对阅读本文的人有用。否则可能是一段随机码 谢谢@WuJo。感谢您的帮助。 我认为这是一种简洁的非正则表达式方法。而且我总是喜欢 pythony 列表理解解决方案! :)

以上是关于匹配和索引所有子字符串,包括重叠的的主要内容,如果未能解决你的问题,请参考以下文章

替换字符串中的重叠匹配项(正则表达式或字符串操作)

匹配两个特殊字符之间的子字符串,不包括字符

我需要一个正则表达式结果,不包括匹配模式的开头和结尾的子字符串

[ jquery 文档处理 wrapInner(htm|element|fnl) ] 此方法用于把所有匹配的元素的子元素(包括文本节点)使用指定的 HTML 元素来包裹

2021-12-18:找到字符串中所有字母异位词。 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成

在 .NET 中查找子字符串匹配的结尾