#python #regex #sed #multiline
#python #регулярное выражение #sed #многострочный
Вопрос:
У меня есть текстовый файл, в котором я хочу выполнить поиск по определенному IP-адресу, и способ настройки текстового файла заключается в том, что имя хоста находится над ip add. ie
real HOSTNAME
address xx.xx.xx.xx
Каков наилучший / самый простой способ получить имя хоста, когда у меня есть только IP-адрес для поиска? Регулярные выражения? Есть ли в python утилита, подобная sed, которая имеет пробел для удержания? Любая помощь приветствуется, спасибо
Ответ №1:
Регулярное выражение, вероятно, является самым простым решением.
>>> 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()
.
Ответ №2:
Если вы знаете, сколько строк имени хоста предшествует 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
Ответ №3:
Возможно, это не лучшее решение, но вы можете использовать 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») для чтения строк из вашего текстового файла.
Комментарии:
1. Хорошее использование аргумента maxlen 🙂