Regex для сопоставления адресов IPv4 - PullRequest
1 голос
/ 01 мая 2019

Допустим, у меня есть 3 строки:

str1 = 'Hello my name is Ben and my IP address is 127.1.1.1'
str2 = 'Hello my name is Folks and my IP address is 1.2.3.4.5'
str3 = 'Hello all, ip addresses: 1.2.3.4.5, 127.1.2.1, 127.2.1.2'

Я хотел бы получить следующий вывод:

find_ip(str1) #['127.1.1.1']
find_ip(str2) #[]
find_ip(str2) #['127.1.2.1', '127.2.1.2']
  1. Критерий:
    • IM-адреса со следующей формой 'x.x.x.x'
    • регулярное выражение должно быть 1 группа .
    • Количество цифр не имеет значения (111.111.111.111) - хорошо.

P.S Решение этого поста StackOverflow не НЕ ответить на этот вопрос.

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Следующее регулярное выражение сопоставляет IP-адреса от 0.0.0.0 до 255.255.255.255, без предшествующего или последующего периода или цифры:

(?<![\.\d])(?:[0-9]\.|1\d?\d?\.|2[0-5]?[0-5]?\.){3}(?:[0-9]|1\d?\d?|2[0-5]?[0-5]?)(?![\.\d])

Демонстрация: https://regex101.com/r/UUCywc/3

Редактировать:чтобы избежать сопоставления IP-адресов с отрицательным числом в качестве первой цифры (например, -127.2.1.2) и разрешить использование IP-адресов, таких как 001.001.001.001, используйте:

(?<![-\.\d])(?:0{0,2}?[0-9]\.|1\d?\d?\.|2[0-5]?[0-5]?\.){3}(?:0{0,2}?[0-9]|1\d?\d?|2[0-5]?[0-5]?)(?![\.\d])

Демо: https://regex101.com/r/UUCywc/6

Полная реализация Python:

import re

str1 = 'Hello my name is Ben and my IP address is 127.1.1.1'
str2 = 'Hello my name is Folks and my IP address is 1.2.3.4.5'
str3 = 'Hello all, ip addresses: 1.2.3.4.5, 127.1.2.1, 127.2.1.2'

def find_ip(test_str):
    regex = re.compile(r"(?<![-\.\d])(?:0{0,2}?[0-9]\.|1\d?\d?\.|2[0-5]?[0-5]?\.){3}(?:0{0,2}?[0-9]|1\d?\d?|2[0-5]?[0-5]?)(?![\.\d])")
    return regex.findall(test_str)

print(find_ip(str1)) #['127.1.1.1']
print(find_ip(str2)) #[]
print(find_ip(str3)) #['127.1.2.1', '127.2.1.2']
0 голосов
/ 01 мая 2019

Пожалуйста, попробуйте ниже регулярного выражения.Он получит IP-адреса, которые начинаются с 127, за которыми следуют 3 набора чисел с точками.

re.findall( r'127+(?:\.[0-9]+){3}', str1 )
re.findall( r'127+(?:\.[0-9]+){3}', str2 )
re.findall( r'127+(?:\.[0-9]+){3}', str3 )

Результат:

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