跳至主要內容

生信中的Python——正则表达式与GQS预测

Haopeng Yu大约 5 分钟

正则表达式算是我最常用的代码技巧吧,因为经常需要文本的模式匹配(就是查找某种字符串)。从我的经验,正则表达式很强大,效率也很高。最近有一个查找转录组中的GQS的项目,正好整理一下正则表达式。

  • 基础匹配
  • 前向断言
  • Kmer

写在前面:

我准备用Python来实现,其实各个语言的正则表达式(Regular expression)语法差异都不大。我不准备写太多基础的东西,就像文档教程那么难看,我就写一些实用的东西。

基础匹配

GQS,G-quadruplex 是一种富含G的碱基片段,现在发现有一大堆不啦不啦的功能。所以第一步就是把他找出来。

比较经典的GQS模式是G3N1-7,用正则表达式这样的:

GGG [ATCG]{1,7} GGG [ATCG]{1,7} GGG [ATCG]{1,7} GGG

e.g.,

GGG AT GGG CTA GGG AGTT GGG

其中:
[ATCG]是这4个字符的一个,{1,7}1-7个

所以上面这个正则表达式简写一下就是:
(G{3}[ATCG]{1,7}){3}G{3} 
picture 1
picture 1

这个例子是3个G,也叫G3。当然植物中还有2个G的情况。不过按照这个正则表达式,是不是就能找到全部的GQS了呢?让我们试试

import re

# 定义一个测试的DNA序列
test_seq = "ATGGGATGGGCTAGGGAGTTGGGACGGGTCAGGGGATTTGGGAGGGCTA"

# 定义正则表达式
gqs_pattern = r"(G{3}[ATCG]{1,7}){3}G{3}"

# 使用正则表达式查找GQS
gqs_matches = re.findall(gqs_pattern, test_seq)

# 输出结果
print("找到的GQS片段:")
for match in gqs_matches:
    print(match)

# 结果:找到的GQS片段:
# GGGATGGGCTAGGGAGTTGGG

从上面的结果可以看出,我们找到了一个GQS片段。但是,我们需要注意的是,这个正则表达式可能会漏掉一些特殊情况,比如G2和G4的情况。为了更全面地找到GQS,我们可以修改正则表达式如下:

gqs_pattern = r"((G{2,4}[ATCG]{1,7}){3,}G{2,4})"

这个正则表达式表示,G可以重复2到4次,然后后面可以跟1到7个任意碱基,这个模式重复3次或以上,最后再以2到4个G结尾。

# 使用修改后的正则表达式查找GQS
gqs_matches = re.findall(gqs_pattern, test_seq)

# 输出结果
print("找到的GQS片段:")
for match in gqs_matches:
    print(match[0])

# 结果:找到的GQS片段:
# GGGATGGGCTAGGGAGTTGGG

前向断言

在使用正则表达式查找GQS片段时,我们可能会遇到一个问题:当两个GQS片段紧邻或重叠时,我们的正则表达式可能无法找到所有的GQS。为了解决这个问题,我们可以使用前向断言(lookahead assertion)来改进我们的正则表达式。

前向断言允许我们在匹配一个模式的同时,检查该模式后面是否符合另一个模式。在这个例子中,我们可以使用前向断言来确保在匹配到一个GQS片段后,立即检查下一个可能的GQS片段。

修改后的正则表达式如下:

gqs_pattern = r"(?=((G{2,4}[ATCG]{1,7}){3,}G{2,4}))"

这里,我们在原有的正则表达式前面加上了(?=...),表示一个前向断言。现在,我们的正则表达式会在匹配到一个GQS片段后,立即检查下一个可能的GQS片段,从而找到所有的GQS。

# 使用修改后的正则表达式查找GQS
gqs_matches = re.finditer(gqs_pattern, test_seq)

# 输出结果
print("找到的GQS片段:")
for match in gqs_matches:
    print(match.group(1))

# 结果:找到的GQS片段:
# GGGATGGGCTAGGGAGTTGGG

通过断言,我们可以确保找到所有的GQS片段,即使它们紧邻或重叠。这对于分析复杂的生物序列非常有用。

Kmer

虽然正则表达式在查找GQS片段方面非常有用,但在某些情况下,它可能无法找到所有的GQS。比如:

seq="GGGAGGGATGGAGGGAGGAGGG"

# 有多个GQS存在在其中
1. GGGAGGGATGGAGGGAGGAGGG
2. GGGAGGGATGGAGG
3. ...

这是因为正则表达式主要依赖于预先定义的模式,而GQS片段可能具有更复杂的结构。为了解决这个问题,我们可以尝试使用kmer的方法来查找GQS。

Kmer是一种将DNA序列划分为长度为k的连续子串的方法。通过分析kmer的组成和分布,我们可以发现序列中的一些潜在模式。在查找GQS片段的情况下,我们可以使用kmer方法来识别具有高G含量和特定G分布的子串。

以下是使用kmer方法查找GQS片段的一个示例:

def find_gqs_by_kmer(seq, k):
    gqs_candidates = []
    for i in range(len(seq) - k + 1):
        kmer = seq[i:i+k]
        g_count = kmer.count("G")
        if g_count >= k * 0.5:  # 设定阈值,如G占kmer的50%以上
            gqs_candidates.append(kmer)
    return gqs_candidates

# 定义一个测试的DNA序列
test_seq = "ATGGGATGGGCTAGGGAGTTGGGACGGGTCAGGGGATTTGGGAGGGCTA"

# 使用kmer方法查找GQS
k = 10  # 可以根据实际情况调整k值
gqs_candidates = find_gqs_by_kmer(test_seq, k)

# 输出结果
print("找到的GQS候选片段:")
for candidate in gqs_candidates:
    print(candidate)

# 结果:找到的GQS候选片段:
# GGGATGGGCT
# GGCTAGGGAG
# GGGAGTTGGG

可以看到,使用kmer方法我们能够找到更多的GQS候选片段。然而,这种方法可能会产生一些假阳性结果,因为它只是基于G的含量和分布,而不是具体的GQS结构。为了提高查找GQS的准确性,我们可以结合正则表达式和kmer方法,首先使用kmer方法找到候选片段,然后使用正则表达式进一步筛选出真正的GQS片段。

总之,kmer方法为我们提供了一种在复杂生物序列中查找GQS片段的补充方法。结合正则表达式和kmer方法,我们可以更全面地识别GQS,并为生物信息学研究提供更多的信息。希望这些技巧能够帮助你在生物信息学领域取得更好的成果!

博主简介
博主简介