我试图从一个由新行('\ n')分隔的大.txt文件中提取多个(50-100)序列。序列是几行长但不总是相同的长度所以我不能只打印行x-y。序列以“结束”,下一行始终以相同的单词开头,因此也许可以用作关键字。
我正在使用python 3.3编写
这是我到目前为止所做的:
searchfile = open('filename.txt' , 'r')
cache = []
for line in searchfile:
cache.append(line)
for line in range(len(cache)):
if "keyword1" in cache[line].lower():
print(cache[line+5])
这会拉出起始行(总是在关键字行下面5行)但是它只会拉出这一行。
如何打印整个序列?
谢谢你的帮助。
编辑1:
当前输出= ABCDCECECCECECE ...
期望输出= ABCBDBEBSOSO ......
ABCBDBDBDBDD ...
continued until " or new line
编辑2
文本文件如下所示:
Name (keyword):
Date
Address1
Address2
Sex
Response"................................"
Y/N
“和”之间的顺序是我需要的
TL; DR - 当end = keyword
时,如何从第+ 5行打印到结尾?答案 0 :(得分:0)
1这可以通过regex
完成import re
lines = 'Name (keyword):','Date','Address1','Address2','Sex','Response"................................" '
for line in lines:
match = re.search('.*?"(:?.*?)"?',line)
if match:
print(match.group(1))
最终要使用此示例代码,我们将从数据集中lines = f.readlines()
。重要的是要注意我们只捕获"
和另一个"
之间的东西,如果最后没有“标记,我们将错过这些数据,但考虑到这一点并不太困难。” / p>
答案 1 :(得分:0)
不确定我是否理解您的序列数据,但是您是否正在搜索每个关键字'那么下一个" char然后以下应该工作:
keyword_pos =[]
endseq_pos = []
for line in range(len(cache)):
if 'keyword1' in cache[line].lower():
keyword_pos.append(line)
if '"' in cache[line]:
endseq_pos.append(line)
for key in keyword_pos:
for endseq in endseq_pos:
if endseq > key:
print(cache[key:endseq])
break
这只是简单地编制了所有关键字和"的所有位置的列表。然后匹配两个字符并打印其间的所有行。
希望有所帮助。
答案 2 :(得分:0)
我同意@Michal Frystacky的观点,即正则表达是前进的方向。但是,正如我现在所理解的那样,我们需要进行两次搜索,其中一个用于'关键字'然后再打5行,找到'序列'
这应该可以,但可能需要调整正则表达式:
import re
with open('yourfile.txt') as f:
lines = f.readlines()
for i,line in enumerate(lines):
#first search for keyword
key_match = re.search(r'\((keyword)',line)
if key_match:
#if successful search 5 lines on for the string between the quotation marks
seq_match = re.search(r'"([A-Z]*)"',lines[i+5])
if seq_match:
print(key_match.group(1) +' '+ seq_match.group(1))