Вопрос:
У меня есть текстовый файл с такими записями:
Interface01 : adress 192.168.0.1 next-interface: interface02: adress 10.123.123.214 next-interface: interface01 : adress 172.123.456.123
Я хотел бы проанализировать его и получить только IP-адрес, соответствующий интерфейсу01
Я пробовал что-то с python re.finall но не смог получить ничего re.finall
i = open(f, r, encoding=’UTF-8′) txt = i.read() interface = re.findall(r’Interface01 :s*(.adress*)n’,txt,re.DOTALL)
но ничего не работает.
Ожидаемый результат – 192.168.0.1.
Лучший ответ:
Вы можете использовать
Interface01s*:s*adresss+(.*)
См. Демо-версию regex. В Python используйте re.search чтобы получить первое совпадение, так как вы хотите только извлечь 1 IP-адрес.
Сведения о шаблоне:
- Interface01 – буквальная подстрока
- s*:s* – a : заключено с пробелами 0+
- adress – буквальная подстрока
- s+ – пробелы 1+
- (.*) – Группа 1: любые символы 0+, отличные от символов разрыва строки.
import re reg = r»Interface01s*:s*adresss+(.*)» with open(‘filename’) as f: m = re.search(reg, f.read()) if m: print(m.group(1)) # => 192.168.0.1 Ответ №1
Как насчет создания шаблона, который сказал “Interface01”, а затем пропустить все символы, которые не являются цифрами, а затем получить цифры и точки?
re.findall(r’Interface01[^0-9]+([0-9.]+)’, text)
Результат:
[‘192.168.0.1’]
Обновить
Благодаря @zipa, это обновленное регулярное выражение:
re.findall(r'[iI]nterface01[^0-9]+([0-9.]+)’, text)
Результат:
[‘192.168.0.1’, ‘172.123.456.123’ Ответ №2interface = re.findall(r’Interface01 :s*.adresss*(.*?)$’,txt,re.S|re.M) Ответ №3
Вы можете попробовать что-то вроде этого:
interface = re.findall(r’Interface01 :n +adressn +(d+.d+.d+.d+)’, txt) # [‘192.168.0.1’] Ответ №4
Для получения одного совпадения лучше использовать re.serach():
import re with open(‘filename’) as f: pat = r’Interface01 :s*S+s*((?:[0-9]{1,3}.){3}[0-9]{1,3})’ result = re.search(pat, f.read()).group(1) print(result)
Выход:
192.168.0.1 Ответ №5
вы можете использовать Interface01 :n.*?n(.*)