Python re.findall с несколькими шаблонами

Вопрос: У меня есть текстовый файл с такими записями: 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 =

Вопрос:

У меня есть текстовый файл с такими записями:

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+, отличные от символов разрыва строки.

Демо-версия Python:

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(.*)

Оцените статью
Добавить комментарий