交替字符序列的位置正则表达式

1 投票
2 回答
69 浏览
提问于 2025-04-12 23:48

我想在一个字符串中找到多个区域(在我的例子中是DNA序列),这些区域的字符是C和G交替出现的,顺序可以是任意的:

str = "ANNNTGCGCCCCGCGGTGCGNNT"
            ^^^^  ^^^^  ^^^
pos    01234567890123456789012
       0         1         2

在上面,我标记了G/C和C/G交替出现的区域,所以我想找一个正则表达式,能够返回一个开始和结束坐标的列表,比如(5:8, 11:14, 17:19),或者使用半闭区间,返回每个区域结束后的位置(5:9, 11:15, 17:20)

理想情况下,这个匹配应该不区分大小写。欢迎任何建议。

补充 - 我很乐意使用任何编程语言的实现(例如Python的re模块)来提取这些位置。

2 个回答

2

感谢@the-fourth-bird,(?:CG)+C?|(?:GC)+G? 这个表达式在放进一个可以返回匹配开始和结束位置的函数里时,可以实现目标。比如在Python中:

import re
s = "ANNNTGCGCCCCGCGGTGCGNNT"
print([
    (m.start(), m.end())
    for m in re.finditer(r"(?:CG)+C?|(?:GC)+G?", s, re.IGNORECASE)
])
2

你可以使用这个正则表达式:

(?=GC|CG)G?(?:CG)*C?

这个表达式可以匹配:

  • (?=GC|CG) : 这是一个前瞻,检查是否有GCCG,确保至少有两个字符(因为其他部分都是可选的)
  • G? : 一个可选的G
  • (?:CG)* : 零个或多个CG;
  • C? : 一个可选的C

你可以在这个网站上查看正则表达式的演示:regex101

在Python中,你可以使用re.finditer来进行搜索,并从每个匹配对象中获取span

s = "ANNNTGCGCCCCGCGGTGCGNNT"
res = [m.span() for m in re.finditer(r'(?=GC|CG)G?(?:CG)*C?', s, re.I)]

输出结果:

[(5, 9), (11, 15), (17, 20)]

撰写回答