用python解析文本数据块itertools.groupby组

2024-10-02 10:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用itertools.groupby组 数据具有以下结构:

BEGIN IONS
TITLE=cmpd01_scan=23
RTINSECONDS=14.605
PEPMASS=694.299987792969 505975.375
CHARGE=2+
615.839727 1760.3752441406
628.788226 2857.6264648438
922.4323436 2458.0959472656
940.4432533 9105.5
END IONS
BEGIN IONS
TITLE=cmpd01_scan=24
RTINSECONDS=25.737
PEPMASS=694.299987792969 505975.375
CHARGE=2+
575.7636234 1891.1656494141
590.3553938 2133.4477539063
615.8339562 2433.4252929688
615.9032114 1784.0628662109
END IONS

我需要从带有“TITLE=”,“PEPMASS=”,“CHARGE=”的行中提取信息。你知道吗

我使用的代码如下:

import itertools
import re

data_file='Test.mgf'
def isa_group_separator(line):
    return line=='END IONS\n'

regex_scan = re.compile(r'TITLE=')
regex_precmass=re.compile(r'PEPMASS=')
regex_charge=re.compile(r'CHARGE=')


with open(data_file) as f:
    for (key,group) in itertools.groupby(f,isa_group_separator):
        #print(key,list(group)) 
        if not key:
            precmass_match = filter(regex_precmass.search,group)
            print precmass_match            

            scan_match= filter(regex_scan.search,group)
            print scan_match

            charge_match = filter(regex_charge.search,group)
            print charge_match 

但是,输出只拾取“PEPMASS=”行,如果“scan\u match”赋值在“precmass\u match”之前完成,则只打印“TITLE=”行

> ['PEPMASS=694.299987792969 505975.375\n'] [] []
> ['PEPMASS=694.299987792969 505975.375\n'] [] []

有人能指出我做错了什么吗?你知道吗


Tags: rescantitlematchgroupregexendprint
2条回答

原因是group是一个迭代器,它只运行一次。 请找到完成此任务的修改脚本。你知道吗

import itertools
import re

data_file='Test.mgf'


def isa_group_separator(line):
    return line == 'END IONS\n'


regex_scan = re.compile(r'TITLE=')
regex_precmass = re.compile(r'PEPMASS=')
regex_charge = re.compile(r'CHARGE=')


with open(data_file) as f:
    for (key, group) in itertools.groupby(f, isa_group_separator):
        if not key:
            g = list(group)

            precmass_match = filter(regex_precmass.search, g)
            print precmass_match

            scan_match = filter(regex_scan.search, g)
            print scan_match

            charge_match = filter(regex_charge.search, g)
            print charge_match

我可能会尝试这样解析(不使用groupby(

import re

file = """\
BEGIN IONS
TITLE=cmpd01_scan=23
RTINSECONDS=14.605
PEPMASS=694.299987792969 505975.375
CHARGE=2+
615.839727 1760.3752441406
628.788226 2857.6264648438
922.4323436 2458.0959472656
940.4432533 9105.5
END IONS
BEGIN IONS
TITLE=cmpd01_scan=24
RTINSECONDS=25.737
PEPMASS=694.299987792969 505975.375
CHARGE=2+
575.7636234 1891.1656494141
590.3553938 2133.4477539063
615.8339562 2433.4252929688
615.9032114 1784.0628662109
END IONS""".splitlines()

pat = re.compile(r'(TITLE|PEPMASS|CHARGE)=(.+)')
data = []

for line in file:
    m = pat.match(line)
    if m is not None:
        if m.group(1) == 'TITLE':
            data.append([])
        data[-1].append(m.group(2))

print(data)

印刷品:

[['cmpd01_scan=23', '694.299987792969 505975.375', '2+'], ['cmpd01_scan=24', '694.299987792969 505975.375', '2+']]

相关问题 更多 >

    热门问题