提取包含特定单词的行
Extract lines containing specific words
输入:
ID aa
AA Homo sapiens
DR ac
BB ad
FT ae
//
ID ba
AA mouse
DR bc
BB bd
FT be
//
ID ca
AA Homo sapiens
DR cc
BB cd
FT ce
//
预期输出:
DR ac
FT ae
//
DR cc
FT ce
//
代码:
word = 'Homo sapiens'
with open(input_file, 'r') as txtin, open(output_file, 'w') as txtout:
for block in txtin.read().split('//\n'): # reading a file in blocks
if word in block: # extracted block containing the word, 'Homo sapiens'
extracted_block = block + '//\n'
for line in extracted_block.strip().split('\n'): # divide each block into lines
if line.startswith('DR '):
dr = line
elif line.startswith('FT '):
ft = line
我阅读了基于'//'(块)的input_file。而且,如果单词 'Homo sapiens' 包含在块中,我会提取块。另外,在block中,'DR '开头的行定义为dr,'FT '开头的行定义为ft。我应该如何写'output',用dr和ft得到'Expected output'?
如果您对基于正则表达式的解决方案持开放态度,那么一种选择是将整个文件读入一个字符串,然后使用 re.findall
:
with open(input_file, 'r') as file:
inp = file.read()
matches = re.findall(r'(?<=//\n)ID.*?\nAA\s+Homo sapiens\n(DR\s+\w+\n)BB\s+\w+\n(FT\s+\w+\n//\n?)', '//\n' + inp)
for match in matches:
for line in match:
print(line, end='')
这会打印:
DR ac
FT ae
//
DR cc
FT ce
//
这里 demo 显示模式可以正确识别每个匹配块中的块和 DR/FT 行。
您可以编写带有标志的简单解析器。总之,当您到达包含 AA 和单词的行时,将标志设置为 True 以保留以下感兴趣的字段,直到到达块结束,在这种情况下您重置标志。
word = 'Homo sapiens'
with open(input_file, 'r') as txtin, open(output_file, 'w') as txtout:
keep = False
for line in txtin:
if keep and line.startswith(('DR', 'FT', '//')):
txtout.write(line)
if line.startswith('//'):
keep = False # reset the flag on record end
elif line.startswith('AA') and word in line:
keep = True
输出:
DR ac
FT ae
//
DR cc
FT ce
//
注意。这要求 AA 在要保存的字段之前。如果没有,你必须用类似的逻辑逐块解析(将数据保存在内存中)
输入:
ID aa
AA Homo sapiens
DR ac
BB ad
FT ae
//
ID ba
AA mouse
DR bc
BB bd
FT be
//
ID ca
AA Homo sapiens
DR cc
BB cd
FT ce
//
预期输出:
DR ac
FT ae
//
DR cc
FT ce
//
代码:
word = 'Homo sapiens'
with open(input_file, 'r') as txtin, open(output_file, 'w') as txtout:
for block in txtin.read().split('//\n'): # reading a file in blocks
if word in block: # extracted block containing the word, 'Homo sapiens'
extracted_block = block + '//\n'
for line in extracted_block.strip().split('\n'): # divide each block into lines
if line.startswith('DR '):
dr = line
elif line.startswith('FT '):
ft = line
我阅读了基于'//'(块)的input_file。而且,如果单词 'Homo sapiens' 包含在块中,我会提取块。另外,在block中,'DR '开头的行定义为dr,'FT '开头的行定义为ft。我应该如何写'output',用dr和ft得到'Expected output'?
如果您对基于正则表达式的解决方案持开放态度,那么一种选择是将整个文件读入一个字符串,然后使用 re.findall
:
with open(input_file, 'r') as file:
inp = file.read()
matches = re.findall(r'(?<=//\n)ID.*?\nAA\s+Homo sapiens\n(DR\s+\w+\n)BB\s+\w+\n(FT\s+\w+\n//\n?)', '//\n' + inp)
for match in matches:
for line in match:
print(line, end='')
这会打印:
DR ac
FT ae
//
DR cc
FT ce
//
这里 demo 显示模式可以正确识别每个匹配块中的块和 DR/FT 行。
您可以编写带有标志的简单解析器。总之,当您到达包含 AA 和单词的行时,将标志设置为 True 以保留以下感兴趣的字段,直到到达块结束,在这种情况下您重置标志。
word = 'Homo sapiens'
with open(input_file, 'r') as txtin, open(output_file, 'w') as txtout:
keep = False
for line in txtin:
if keep and line.startswith(('DR', 'FT', '//')):
txtout.write(line)
if line.startswith('//'):
keep = False # reset the flag on record end
elif line.startswith('AA') and word in line:
keep = True
输出:
DR ac
FT ae
//
DR cc
FT ce
//
注意。这要求 AA 在要保存的字段之前。如果没有,你必须用类似的逻辑逐块解析(将数据保存在内存中)