交替字符序列的位置正则表达式
我想在一个字符串中找到多个区域(在我的例子中是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)
: 这是一个前瞻,检查是否有GC
或CG
,确保至少有两个字符(因为其他部分都是可选的)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)]