регулярное выражение для ipaddress и mac-адреса - PullRequest
4 голосов
/ 13 марта 2011

Может кто-нибудь предложить мне регулярное выражение для IP-адреса и MAC-адреса?

Я использую Python & Django

например, http://[ipaddress]/SaveData/127.0.0.1/00-0C-F1-56-98-AD/

для MAC-адреса, я пытался следовать, но не работал

([0-9A-F]{2}[:-]){5}([0-9A-F]{2})

^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$

Ответы [ 6 ]

13 голосов
/ 13 марта 2011
import re
s = "http://[ipaddress]/SaveData/127.0.0.1/00-0C-F1-56-98-AD/"

re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', s, re.I).group()
'00-0C-F1-56-98-AD'

re.search(r'((2[0-5]|1[0-9]|[0-9])?[0-9]\.){3}((2[0-5]|1[0-9]|[0-9])?[0-9])', s, re.I).group()
'127.0.0.1'

Поместите этот фрагмент в файл определений маршрутизации Django - urls.py

url(r'^SaveData/(?P<ip>((2[0-5]|1[0-9]|[0-9])?[0-9]\.){3}((2[0-5]|1[0-9]|[0-9])?[0-9]))/(?P<mac>([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))', SaveDataHandler.as_view()),
2 голосов
/ 13 марта 2011

Ваше регулярное выражение содержит только две группы захвата (круглые скобки), поэтому оно не хранит полный адрес (первая группа «перезаписывается»). Попробуйте это:

# store each octet into its own group
r"([\dA-F]{2})[-:]([\dA-F]{2})[-:]([\dA-F]{2})[-:]([\dA-F]{2})[-:]([\dA-F]{2})[-:]([\dA-F]{2})"
# store entire MAC address into a single group
r"([\dA-F]{2}(?:[-:][\dA-F]{2}){5})"

IP-адреса становятся сложнее, потому что диапазоны являются двоичными, но представление является десятичным.

# store each octet into its own group
r"(\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))"
# store entire IP address into a single group
r"((?:\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))(?:\.(?:\d|[1-9]\d|1\d\d|2(?:[0-4]\d|5[0-5]))){3})"
0 голосов
/ 04 ноября 2014

хорошо, вот что я использую для IPV4

([0-9] {1,3}.) {3} [0-9] {1,3}

протестировано с

127.0.0.1 255.255.255.255

и работает для всех

0 голосов
/ 29 октября 2012

рассмотрите s = 256.1.1.1. Я хотел бы внести небольшие изменения в ответ Михала:

def find_ip(s):
    part = '(2[0-4]|1[0-9]|[0-9])?[0-9]|25[0-5]'
    res =re.search(r'(^| )((%s)\.){3}(%s)' %(part,part), s,re.I )
    if res:
        return res.group().strip()
    else:
        return ''

примечание '(^ |)' означает начало строки или пробел вперед, чтобы избежать получения '56 .1.1.1 'из' 256.1.1.1 '

0 голосов
/ 13 марта 2011

Вы можете использовать /^([0-2]?\d{0,2}\.){3}([0-2]?\d{0,2})$/ для IPv4-адреса и /^([\da-fA-F]{1,4}:){7}([\da-fA-F]{1,4})$/i для IPv6-адреса.

Вы можете объединить эти два как /^((([0-2]?\d{0,2}\.){3}([0-2]?\d{0,2}))|(([\da-fA-F]{1,4}:){7}([\da-fA-F]{1,4})))$/i.Вы можете найти образец здесь .

Ссылка: http://snipplr.com/view/49994/ipv4-regex/, http://snipplr.com/view/49993/ipv6-regex/

Для Mac-адреса Вы можете использовать /^([0-9A-F]{2}[-:]){5}[0-9A-F]{2}$/i.Вы можете найти образец здесь .

0 голосов
/ 13 марта 2011

Это для MAC-адреса:

([0-9A-F]{2}[:-]){5}([0-9A-F]{2})
...