在特定匹配模式后打印上面的 2 行(带有特定单词)

时间:2020-12-22 01:16:59

标签: python

我是 Python 新手。我有一个包含模式列表的文件和一个包含这些模式的大文件。 我想提取具有这些模式的行和这些匹配项上方的两行,其中包含特定的单词。

我的大文件:bigfile.txt

<块引用>

QUERY Query_17 肽 93 ANN2
结束查询
2 Query_17 具体 197609 50 89 - 389788
2 Query_17 具体 197609 50 89 - 389788
2 Query_17 具体 197609 50 89 LysM - 389788
结束查询
QUERY Query_33 肽 305 ANN2
2 Query_33 具体 372835 33 134 GUB_WAK_bind - 45
2 Query_33 非特定 373037 222 WAK_assoc N 45
结束查询
QUERY Query_42 肽 217 ANN3
结束查询
QUERY Query_43 肽 435 ANN3
2 Query_43 具体 237995 47 164 B_lectin - 390234
结束查询
QUERY Query_45 肽 717 ANN34
结束查询
2 Query_45 具体 214519 44 160 - 390234
2 Query_45 具体 237995 376 449 B_lectin N 390234

我的模式匹配文件:

<块引用>

LysM、GUB_WAK_bind、WAK_assoc、B_lectin

预期输出:

<块引用>

QUERY Query_17 肽 93 ANN2
2 Query_17 具体 197609 50 89 LysM - 389788
QUERY Query_33 肽 305 ANN2
2 Query_33 具体 372835 33 134 GUB_WAK_bind - 45
2 Query_33 非特定 373037 222 WAK_assoc N 45
QUERY Query_43 肽 435 ANN3
2 Query_43 具体 237995 47 164 B_lectin - 390234
QUERY Query_45 肽 717 ANN34
2 Query_45 具体 237995 376 449 B_lectin N 390234

任何帮助都会很棒。

谢谢

1 个答案:

答案 0 :(得分:0)

更新

经过一些澄清后,似乎原始问题的表述不太正确。相反,目标是为每个匹配的行获取:

  • 前一个 QUERY 行(除非已经打印),
  • 匹配的行。

不同的目标 --> 不同的答案:

def query_grep(file, substrings):
    lastquery = None
    with open(filename, 'r') as f:
        for line in f:
            line = line[:-1]  # remove newline
            if line.startswith('QUERY'):
                lastquery = line
            else:
                if any(s in line for s in substrings):
                    if lastquery is not None:
                        yield lastquery
                        lastquery = None
                    yield line

示例:

substrings = ['LysM', 'GUB_WAK_bind', 'WAK_assoc', 'B_lectin']

with open(filename, 'r') as f:
    for res in query_grep(f, substrings):
        print(res)

# or, the get whole list at once and print:
with open(filename, 'r') as f:
    print('\n'.join(query_grep(f, substrings)))

# either way, the output it:
QUERY Query_17 Peptide 93 ANN2
2 Query_17 Specific 197609 50 89 LysM - 389788
QUERY Query_33 Peptide 305 ANN2
2 Query_33 Specific 372835 33 134 GUB_WAK_bind - 45
2 Query_33 Non-specific 373037 222 WAK_assoc N 45
QUERY Query_43 Peptide 435 ANN3
2 Query_43 Specific 237995 47 164 B_lectin - 390234
QUERY Query_45 Peptide 717 ANN34
2 Query_45 Specific 237995 376 449 B_lectin N 390234

原答案

Python 的 deques 在处理这类事情(以及许多其他事情)时派上用场:

# assuming you just want to look for substrings. Otherwise, use regex.
substrings = ['LysM', 'GUB_WAK_bind', 'WAK_assoc', 'B_lectin']
d = deque(maxlen=2)
with open(filename, 'r') as f:
    for line in f:
        line = line.rstrip('\n')
        if any(s in line for s in substrings):
            print('\n'.join(d))
            print(line)
        d.append(line)
相关问题