打印完整序列不仅仅是第一行| Python 3.3 |从特定行到结尾打印(“)

时间:2016-02-16 21:44:37

标签: python parsing sequence

我试图从一个由新行('\ 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行打印到结尾?

3 个答案:

答案 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))