如何在Python中获取匹配行后的行

7

我是一个业余爱好者,偶尔使用Python。抱歉如果这是一个愚蠢的问题,但我想知道是否有一种简单的方法可以在输入文件格式如下时抓取一堆行:

" 标题1

行1

行2

行3

标题2

行1

行2

行3 "

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

我知道读取文件的唯一方法是“for line in file:”,但我不知道如何获取当前行之后的行。希望这样说得清楚,感谢您的帮助!

*感谢所有回复!我尝试了一些解决方案,但我的问题是并非所有标题都具有相同的名称,我不确定该如何解决。我需要为每个标题使用不同的正则表达式...有什么建议吗?*


针对您的编辑:您需要有一种识别哪些行是标题的方法。您能提供一些实际的例子吗? - Phil H
当然,这里有一些我正在使用的正则表达式来识别头部,以 //:'[0-9]+ common elements:' // '[0-9]+ models with [0-9] elements:' // 'Model model_[0-9]el_[0-9]' 为分隔符。 - toofly
不要将这个问题(标题和细节)与第二个问题混淆,后者只是部分相关。不要更新此内容以增加混淆。首先:在 Stack Overflow 上搜索正则表达式帮助。其次:在 Python 教程中搜索正则表达式帮助。第三:在尝试了无法工作的代码后,创建一个新的问题,重点关注您的正则表达式问题。附上代码。但它不能工作。 - S.Lott
1
我对正则表达式没有困扰——它们运行良好。我的问题仅在于,你的解决方案假设每个标题都以“Heading”开头,但实际上标题彼此完全不同。有没有一种简单地修改您的解决方案以适应这种情况的方法?感谢您的帮助。 - toofly
4个回答

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,但我认为你的意思是buffer=[line]而不是buffer=[heading] - Steven Rumbalski
谢谢!这是一个很棒的解决方案(不得不阅读一些关于生成器函数的内容)。 - toofly
@toofly:如果您接受S.Lott的答案,您们两个都将获得声望点数。 - Steven Rumbalski

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)

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


1
除了使用生成器,我认为我们可以创建一个字典,其中键是“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)

-1

我实际上并不了解Python,但这里有一些伪代码。

int header_found = 0;

[开始循环遍历文件中的每一行]

如果(header_found == 1) [获取该行]; header_found = 0;

如果(line =~ /[头部的正则表达式]/) header_found = 1;

这个想法是有一个变量来跟踪你是否已经找到了一个头部,并且如果你找到了,就获取下一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接