如何在python中的匹配行之后抓取行

时间:2011-01-04 15:19:53

标签: python text file-io

我是一名业余爱好者,现在使用Python打开和关闭一段时间。很抱歉,如果这是一个愚蠢的问题,但我想知道如果输入文件中的格式是这样的话,是否有人知道如何轻松获取一堆行:

” 标题1

第1行

第2行

第3行

标题2

第1行

第2行

第3行 “

我不知道每个标题后有多少行,但我想抓住它们。我所知道的只是标题的名称或正则表达式模式。

我知道读取文件的唯一方法是“for file in file:”方式,但我不知道如何抓住我当前所在行之后的行。希望这是有道理的,谢谢你的帮助!

*感谢所有回复!我试图实现一些解决方案,但我的问题是并非所有标题都是相同的名称,我不知道如何解决它。我需要为每个提出不同的正则表达式...任何建议? *

4 个答案:

答案 0 :(得分:7)

生成器功能

def group_by_heading( some_source ):
    buffer= []
    for line in some_source:
        if line.startswith( "Heading" ):
            if buffer: yield buffer
            buffer= [ line ]
        else:
            buffer.append( line )
    yield buffer

with open( "some_file", "r" ) as source:
    for heading_and_lines in group_by_heading( source ):
        heading= heading_and_lines[0]
        lines= heading_and_lines[1:]
        # process away.

答案 1 :(得分:4)

您可以使用变量标记当前正在跟踪的标题的位置,如果已设置,请抓住每一行,直到找到另一个标题:

data = {}
for line in file:
    line = line.strip()
    if not line: continue

    if line.startswith('Heading '):
        if line not in data: data[line] = []
        heading = line
        continue

    data[heading].append(line)

这是一个http://codepad.org代码段,展示了它的工作原理:http://codepad.org/KA8zGS9E

编辑:如果您不关心实际的标题值,只想在最后找到一个列表,则可以使用:

data = []
for line in file:
    line = line.strip()
    if not line: continue

    if line.startswith('Heading '):
        continue

    data.append(line)

基本上,您不需要跟踪标题的变量,而只需过滤掉与标题模式匹配的所有行。

答案 2 :(得分:1)

除了生成器之外,我认为我们可以创建一个dict,其中键是“Heading”,值是一个保存行的列表。这是代码

odd_map = {}
odd_list = []
with open(file, 'r') as myFile:
    lines = myFile.readlines()
    for line in lines:
        if "Heading" in line:
            odd_list = []
            odd_map[line.strip()] = odd_list
        else:    
            odd_list.append(line.strip())

for company, odds in odd_map.items():
    print(company)
    for odd in odds:
        print(odd)

答案 3 :(得分:-1)

我不太了解Python,但这里有点伪代码。

int header_found = 0;

[从你在文件行中循环的循环开始]

如果(header_found == 1)     [抢线];     header_found = 0;

if(line =〜/ [regexp for header] /)     header_found = 1;

我们的想法是拥有一个变量来跟踪您是否找到了标题,如果有,还可以抓住下一行。