Мне нужна помощь, чтобы извлечь последние два октета IP-адреса (3-й и 4-й октет) с помощью регулярного выражения.

Это регулярное выражение работает для извлечения первых двух октетов (1-го и 2-го октетов) :

( 1 \ д \ д | ? 2 [ 0-4 ] \ д | 25 [ 0-5 ] )

Вы можете попробовать это здесь https://rubular.com/r/ynDa71Zd1M2f24

Но я не знаю, как извлечь 3-й и 4-й октет. Кто-нибудь может мне помочь?

  • Вход: 192.168.1.1 Выход: 192.168.0.0/16
  • Вход: 192.168.2.1 Выход: 192.168.0.0/16
  • Вход: 10.10.1.1 Выход: 10.10.0.0/16

Спасибо,

0
Faro 22 Апр 2020 в 05:26

2 ответа

Лучший ответ

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

В замене используйте значение группы захвата $1, за которым следует 0.0/16

=REGEXREPLACE(A2,"^(\d{1,3}\.\d{1,3}\.)\d{1,3}\.\d{1,3}$","$10.0/16")

Смотрите демонстрационную версию regex

enter image description here

0
The fourth bird 22 Апр 2020 в 18:26

Решение

Вы можете использовать что-то вроде этого:

(?P<first>\d{2,3})\.(?P<second>\d{1,3})\.(?P<third>\d{1,3})\.(?P<fourth>\d{1,3})

Или, если у вас нет поддержки именованной группы захвата, просто используйте:

(\d{2,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})

Это разделит ваши строки на четыре разные группы, каждая из которых содержит один октет ip.

Примере

import re

pattern = r"(?P<first>\d{2,3})\.(?P<second>\d{1,3})\.(?P<third>\d{1,3})\.(?P<fourth>\d{1,3})\n?"
matcher = re.compile(pattern)

ips = """
192.168.1.1
192.168.1.2
"""

result = matcher.findall(ips) # [('192', '168', '1', '1'), ('192', '168', '1', '2')]
0
Oryan Moshe 22 Апр 2020 в 14:24