Python中复杂的正则表达式匹配

3
我有一个包含以下数据的txt文件:
chrI
ATGCCTTGGGCAACGGT...(多行)
chrII
AGGTTGGCCAAGGTT...(多行)
我想先找到“chrI”,然后迭代ATGC的多行,直到找到第x个字符。然后我想打印第x个字符到第y个字符。我一直在使用正则表达式,但是一旦我定位到包含chrI的行,我不知道如何继续迭代以找到第x个字符。
这是我的代码:
for i, line in enumerate(sacc_gff):
    for match in re.finditer(chromo_val, line):
        print(line)
        for match in re.finditer(r"[ATGC]{%d},{%d}\Z" % (int(amino_start), int(amino_end)), line):
            print(match.group())

变量含义:

chromo_val = chrI

amino_start = (我的程序找到的一些起始点)

amino_end = (我的程序找到的一些终止点)

注意:amino_startamino_end需要以变量形式存在。

如果您还有疑问,请告诉我。谢谢。


4
你的序列是否遵循fasta格式?如果不是,你可以通过在每个名称前面添加">"来轻松实现此格式。这将允许使用biopython,并使得这个过程非常容易。 - Darwin
假设第x个字符是2,第y个字符是4,然后使用以下数据:ATGCCCGT,我将在控制台上打印TGC。 - Medici
你使用的是Linux还是OSX? - Darwin
达尔文:是的,我的数据来自一个 .gff 文件,">" 在 chrI 和 chrII 之前。 - Medici
达尔文:我正在使用Linux,但我是用Emacs编写文件的。 - Medici
显示剩余2条评论
2个回答

3

看起来你正在处理fasta数据,因此我将考虑这一点提供答案,但如果不是的话,你仍然可以使用子序列选择部分。

fasta_data = {} # creates an empty dictionary
with open( fasta_file, 'r' ) as fh:
    for line in fh:
        if line[0] == '>':
            seq_id = line.rstrip()[1:] # strip newline character and remove leading '>' character
            fasta_data[seq_id] = ''
        else:
            fasta_data[seq_id] += line.rstrip()

# return substring from chromosome 'chrI' with a first character at amino_start up to but not including amino_end
sequence_string1 = fasta_data['chrI'][amino_start:amino_end]
# return substring from chromosome 'chrII' with a first character at amino_start up to and including amino_end
sequence_string2 = fasta_data['chrII'][amino_start:amino_end+1]

fasta格式:

>chr1
ATTTATATATAT
ATGGCGCGATCG
>chr2
AATCGCTGCTGC

谢谢你的回答,benie。我从未使用过“with”,所以现在正在阅读相关资料。 - Medici
Benine,我看不出你是如何迭代并找到“amino_start”直到“amino_end”的?另外,你是否使用“fasta_data = {}”创建了一个空列表? - Medici
我在代码中添加了一些注释。 fasta_data = {} 创建一个空字典,以ID为键存储序列。fasta_data['chrI'][amino_start:amino_end] 从氨基酸起始索引到氨基酸结束索引返回一个子字符串(请记住,这不包括氨基酸结束处的字符)。如果您需要遍历该字符串,可以使用 for c in sequence_string1: 进行遍历。(有关在Python中迭代字符串的详细信息:https://dev59.com/BnRB5IYBdhLWcg3wuZU1) - afinit
这看起来很有前途,我会尝试将其合并到我的代码中并让您知道它的效果。感谢您的帮助,我会继续更新 :) - Medici
@Medici 我想我应该更清楚地提到var[:]符号在Python中被称为切片符号。更多的解释可以在这里找到:(https://dev59.com/D3RB5IYBdhLWcg3wyqOo)。这是关于列表的,但同样适用于字符串。 - afinit
显示剩余2条评论

0

由于您正在使用格式如下的fasta文件:

>Chr1
ATCGACTACAAATTT
>Chr2
ACCTGCCGTAAAAATTTCC

如果你是一个生物信息学专业的学生,我猜你经常需要操作序列。我建议安装一个名为FAST的Perl包。一旦安装完成,你可以使用以下命令获取每个序列的第2-14个字符:

fascut 2..14 fasta_file.fa

这里是最近的FAST出版物Github链接,其中包含了一个完整的命令行分子序列数据操作工具箱。


Darwin,感谢你的回答,但由于这是一个班级问题,我只能使用Python。然而,在没有这样的限制时,当我进行数据挖掘时,我一定会考虑到你的建议。 :) - Medici
1
那就使用biopython包吧。 - Darwin
我觉得我的教授可能会不太赞同这样做,因为这会减少“学习经验”。无论如何,我应该给他发电子邮件并寻求一些指导。再次感谢你的帮助。 :) - Medici
这可能是个人偏好的问题,但作为一名生物信息学工作者,我认为过度依赖外部库可能是不好的实践。特别是对于刚开始学习编程的人来说,当本地Python的解决方案如此简单时,过度依赖外部库可能会让人变得懒惰。我还会认为本地解决方案是更符合Python风格的选项。 - afinit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接