使用python,我想提取并打印在每个块的第一行中包含10917、11396和1116920的块

使用python,我想提取并打印在每个块的第一行中包含10917、11396和1116920的块,python,python-2.7,Python,Python 2.7,每个块以hg19开始,以空白结束。我可以使用正则表达式提取所需的块吗 hg19.chr1 10917 479 panTro2.chr15 13606 455 hg19.chr1 11396 93 panTro2.chr15 14061 42 bosTau4.chr5 113864279 105 hg19.chr1 11489 81 panTro2.chr15 14103 81 bosTau4.chr5 113864398 80 equCab2.chr6 54105327 83 canFam2

每个块以hg19开始,以空白结束。我可以使用正则表达式提取所需的块吗

hg19.chr1 10917 479
panTro2.chr15 13606 455

hg19.chr1 11396 93
panTro2.chr15 14061 42
bosTau4.chr5 113864279 105

hg19.chr1 11489 81
panTro2.chr15 14103 81
bosTau4.chr5 113864398 80
equCab2.chr6 54105327 83
canFam2.chr27 45128907 82
calJac1.Contig8673 78513 67

hg19.chr1 1116920 38
panTro2.chr1 1103202 38
gorGor1.Supercontig_0004540 23214 38
ponAbe2.chr1 534356 38
papHam1.scaffold19767 38455 38
calJac1.Contig4288 217257 29
micMur1.scaffold_101519 296 37
dipOrd1.scaffold_7421 49811 22
cavPor3.scaffold_186 248497 22
bosTau4.chr16 29320296 47
equCab2.chr2 72413055 53
felCat3.scaffold_124042 293309 9

hg19.chr1 1116863 57
papHam1.scaffold19767 38399 56
ponAbe2.chr1 534300 56


and so on...

我尝试过使用各种正则表达式,但没有成功。

下面将从名为
input.txt的文件中读取数据。然后创建一个包含所有块的列表。然后,它会筛选此列表以仅包含所需的条目,然后显示它们:

import re

with open('input.txt') as f_input:
    data = f_input.read()
    blocks = re.findall(r'(^hg19\..*?)\n*?(?=^hg19\.|\Z)', data, re.S + re.M)

allowed = set(["10917", "11396", "1116920"])
blocks = [block for block in blocks if block.split('\n', 1)[0].split()[1] in allowed]

for block in blocks:
    print block
    print '----'
这将显示以下内容:

hg19.chr1 10917 479
panTro2.chr15 13606 455
----
hg19.chr1 11396 93
panTro2.chr15 14061 42
bosTau4.chr5 113864279 105
----
hg19.chr1 1116920 38
panTro2.chr1 1103202 38
gorGor1.Supercontig_0004540 23214 38
ponAbe2.chr1 534356 38
papHam1.scaffold19767 38455 38
calJac1.Contig4288 217257 29
micMur1.scaffold_101519 296 37
dipOrd1.scaffold_7421 49811 22
cavPor3.scaffold_186 248497 22
bosTau4.chr16 29320296 47
equCab2.chr2 72413055 53
felCat3.scaffold_124042 293309 9
----

这假设您的文件足够小,可以一次轻松地放入内存。使用Python2.7.6测试,下面将从名为
input.txt的文件中读取数据。然后创建一个包含所有块的列表。然后,它会筛选此列表以仅包含所需的条目,然后显示它们:

import re

with open('input.txt') as f_input:
    data = f_input.read()
    blocks = re.findall(r'(^hg19\..*?)\n*?(?=^hg19\.|\Z)', data, re.S + re.M)

allowed = set(["10917", "11396", "1116920"])
blocks = [block for block in blocks if block.split('\n', 1)[0].split()[1] in allowed]

for block in blocks:
    print block
    print '----'
这将显示以下内容:

hg19.chr1 10917 479
panTro2.chr15 13606 455
----
hg19.chr1 11396 93
panTro2.chr15 14061 42
bosTau4.chr5 113864279 105
----
hg19.chr1 1116920 38
panTro2.chr1 1103202 38
gorGor1.Supercontig_0004540 23214 38
ponAbe2.chr1 534356 38
papHam1.scaffold19767 38455 38
calJac1.Contig4288 217257 29
micMur1.scaffold_101519 296 37
dipOrd1.scaffold_7421 49811 22
cavPor3.scaffold_186 248497 22
bosTau4.chr16 29320296 47
equCab2.chr2 72413055 53
felCat3.scaffold_124042 293309 9
----

这假设您的文件足够小,可以一次轻松地放入内存。使用Python 2.7.6测试

从什么中提取数据?txt文件?是的,它是一个txt文件。也许你可以看看或类似的。它需要使用正则表达式吗?如果一条线以hg19开始,则开始一个块,当您将新线视为线时,则结束该块。它可以通过一个简单的
for
循环和
readline
.Nope来完成。正则表达式不是必需的。从什么中提取数据?txt文件?是的,它是一个txt文件。也许你可以看看或类似的。它需要使用正则表达式吗?如果一条线以hg19开始,则开始一个块,当您将新线视为线时,则结束该块。它可以通过一个简单的
for
循环和
readline
.Nope来完成。正则表达式不是必需的。