我是 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
任何帮助都会很棒。
谢谢
答案 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 的 deque
s 在处理这类事情(以及许多其他事情)时派上用场:
# 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)