Получение строки над значением поиска в python

У меня есть текстовый файл, который я хочу найти для определенного IP-адреса, и способ настройки текстового файла заключается в том, что имя хоста находится выше IP-адреса. то есть

real HOSTNAME

address xx.xx.xx.xx

Каков наилучший/самый простой способ получить имя хоста, когда у меня есть только IP-адрес для поиска? Обычные выражения? Есть ли в python утилита, похожая на sed, в которой есть место для хранения? Любая помощь приветствуется, спасибо


person Greg Brown    schedule 14.11.2011    source источник


Ответы (3)


Если вы знаете, сколько строк имя хоста перед ip, вы можете перечислить список строк и вычесть необходимое количество строк из текущего индекса:

lines = open("someFile", "r").read().splitlines()
IP = "10.10.1.10"
hostname = None
for i, line in enumerate(lines):
    if IP in line:
        hostname = lines[i - 1]
        break

if hostname:
    # Do stuff
person chown    schedule 14.11.2011

Регулярное выражение, вероятно, является самым простым решением.

>>> textdata = '''
someline
another line
real HOSTNAME

address 127.0.0.1
post 1
post 2
'''
>>> re.findall('^(.*)$\n^.*$\naddress 127.0.0.1', textdata, re.MULTILINE)
['real HOSTNAME']

Вы также можете использовать модуль linecache или просто прочитать все строки в список с использованием f.readlines().

person Raymond Hettinger    schedule 14.11.2011

Возможно, это не лучшее решение, но вы можете использовать deque, чтобы поймать n строк выше вашей целевой строки:

from collections import deque
from itertools import takewhile

test = """
real others

address xxx.xxx.xxx

real local

address 127.0.0.1

real others

address xxx.xxx.xxx
""".split("\n")

pattern = "address 127.0.0.1"
print deque(takewhile(lambda x:x.strip()!=pattern, test), 2)[0]

измените тестовую переменную на file("yourfilename"), чтобы читать строки из вашего текстового файла.

person HYRY    schedule 14.11.2011
comment
Хорошее использование аргумента maxlen :-) - person Raymond Hettinger; 14.11.2011