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

7 投票
4 回答
17368 浏览
提问于 2025-04-16 09:23

我最近在用Python,算是个业余爱好者。抱歉如果这个问题听起来很傻,但我想知道有没有简单的方法来抓取一些行,假设输入文件的格式是这样的:

" 标题 1

第一行

第二行

第三行

标题 2

第一行

第二行

第三行 "

我不知道每个标题后面有多少行,但我想把它们全部抓取下来。我只知道标题的名字,或者一个正则表达式模式。

我知道的读取文件的方法是“for line in file:”这种方式,但我不知道怎么抓取当前行之后的行。希望这样说能让你明白,谢谢你的帮助!

*感谢大家的回复!我试着实现了一些解决方案,但我的问题是并不是所有的标题名字都一样,我不确定该怎么处理。每个标题我都需要不同的正则表达式……有什么建议吗?*

4 个回答

1

除了使用生成器之外,我觉得我们可以创建一个字典,字典的键是“标题”,而值是一个列表,用来保存每一行的内容。下面是代码:

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)
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/KA8zGS9E

编辑:如果你不在乎实际的标题内容,只想在最后得到一个列表,你可以这样做:

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

    if line.startswith('Heading '):
        continue

    data.append(line)

基本上,你其实不需要跟踪标题的变量,而是可以直接过滤掉所有符合标题模式的行。

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.

撰写回答