Как получить первый IP-адрес из строки - PullRequest
2 голосов
/ 18 марта 2019

Я пытаюсь получить ip address из строки и сталкиваюсь с проблемой. Пожалуйста, помогите.
inet addr:11.11.11.11 Bcast:11.11.11.111 Mask:111.111.11.1.
Это моя строка, и мне нужен IP-адрес рядом с addr:

Я попробовал следующий код и не смог выполнить в python:

ip = re.findall(r'(?:\d{1,3}\.)+(?:\d{1,3})', line) и получить элемент индекса 0.

Результат: Это фактически ничего не дает мне взамен

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Я заметил, что ваше регулярное выражение будет соответствовать недействительным адресам IPv4.

import re

string = 'inet addr:300.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1'

# your pattern 
ip_address_pattern = re.compile(r'(?:\d{1,3}\.)+(?:\d{1,3})')
find_ip_address = re.findall(ip_address_pattern, string)
if find_ip_address:
   print (find_ip_address)
   # outputs
   ['300.11.11.11', '11.11.11.111', '111.111.11.1']

Я использовал это IPv4_format в прошлом для извлечения действительных адресов IPv4.

import re

string = 'inet addr:11.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1'

# Valid IPv4 address format
ip_address_pattern = re.compile(r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b')
find_ip_address = re.findall(ip_address_pattern, string)
if find_ip_address:
  print (find_ip_address)
  # outputs
  ['11.11.11.11', '11.11.11.111', '111.111.11.1']
0 голосов
/ 19 марта 2019
import re

line = "inet addr:11.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1"

pattern = r"[\d]{2}[.][\d]{2}[.][\d]{2}[.][\d]{2}[\D]"

re.findall(pattern, line)

['11.11.11.11 ']

re.findall(pattern, line)[0].strip()

'11.11.11.11'

если у вас есть более одного элемента в списке, просто запустите list-comp, используя .strip()

[i.strip() for i in re.findall(pattern, line)]

['11.11.11.11']

re.match() не будет работать, потому что он будет пытаться соответствовать вашему шаблону, начиная с начала строки (при условии, что ваш шаблон не включает в себя « inet addr: ».
re.search() работает, но пропускает повторяющиеся элементы и возвращает только первое столкновение с шаблоном при успешном совпадении, кроме того, вам нужно будет использовать filter для извлечения элемента.

наконец, ключ к решению этой проблемы лежит в последнем символе вашей цели, xx.xx.xx.xx[\D]. Директива [\D] гарантирует, что шаблон ищет нецелое число с индексом 12, [\s] работает одинаково хорошо и соответствует пробелу.

0 голосов
/ 18 марта 2019

Ваш REGEX может быть более конкретным, я думаю, вы могли бы использовать что-то вроде:

addr:(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

В питоне:

match = re.match(r'addr:(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', line)

Затем вы можете получить доступ к группе ip, позвонив match.group('ip').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...