如何在Python 3中向后搜索几行?

时间:2015-08-30 13:59:23

标签: python python-3.x find

Python Reverse Find in String中有向后搜索内嵌的解决方案:

s.rfind('I', 0, index)

但是如果我需要在该行上方的几行中搜索一个字符串?假设我使用以下命令找到了关键字:

with open("file.txt") as f
    searchlines = f.readlines()

for i, line in enumerate(searchlines):
    if "keyword" in line: 
    do_something()

我希望do_something()是向后找另一个关键字。要应用上面的代码,我想我需要f.read(),以便我可以将文件作为字符串。但这完全是坚果,因为我必须readlines()read()(大)文件。我需要使用readlines(),因为第一个关键字可能会在文本中多次出现,我需要全部找到它们。

有没有更好的方法呢?

image description

@engineer
- kỹ sư
@engineering
- kỹ thuật
- civil e. ngành xây dựng
- communication e. kỹ thuật thông tin
- control e. kỹ thuật [điều chỉnh, điều khiển] (tự động)
- development e. nghiên cứu những kết cấu mới

1 个答案:

答案 0 :(得分:4)

我宁愿这样做:因为你想要找到以@开头的行,我宁愿将所有行存储在列表中,如果新行开始,则丢弃前面的行找到@

因此我们得到:

def do_something(lines):
    print("I've got:")
    print(''.join(lines))

lines = []

with open("file.txt") as f:
    for i, line in enumerate(f):
        if line.startswith('@'):
            lines = []

        lines.append(line)
        if 'development' in line:
            do_something(lines)

您拥有file.txt的输出将是:

I've got:
@engineering
- kỹ thuật
- civil e. ngành xây dựng
- communication e. kỹ thuật thông tin
- control e. kỹ thuật [điều chỉnh, điều khiển] (tự động)
- development e. nghiên cứu những kết cấu mới

一般情况下,如果您想要最后看到N行,可以使用collections.deque代替列表:

from collections import deque
N = 100
last_lines = deque(maxlen=N)

with open("file.txt") as f:
    for i, line in enumerate(f):
        last_lines.append(line)
        if 'development' in line:
            do_something(last_lines)

如果当前行包含单词do_somethingdevelopment最多会传递100个最后一行,包括当前行。