2015-08-30 2 views
1

Существует решение для поиска назад инлайн в Python Reverse Find in String:Как искать назад несколько строк в Python 3?

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 
+0

Не могли бы вы объяснить немного? И было бы неплохо, если бы это были символы, а не изображение. –

+0

Какую часть вы не понимаете? Разве мой вопрос не объясняет? Я не знаю, нужны ли вам строки из рисунка или нет. Это просто для иллюстрации. Но если вы настаиваете ... – Ooker

+0

https://regex101.com/r/iL2fT6/1 –

ответ

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_something будет передан до 100 последних строк, включая текущую строку, если текущая строка содержит слово development.

+0

Просто блестящий. Вместо того, чтобы искать назад, вы просто запоминаете весь текст между двумя ключевыми словами и перезагружаете «память», если это неверно. – Ooker

Смежные вопросы