регулярное выражение для IP-адреса и MAC-адреса

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

я использую питон и джанго

например, 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})$

person Hunt    schedule 13.03.2011    source источник


Ответы (7)


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()),
person Michal Chruszcz    schedule 13.03.2011
comment
у меня есть следующая функция, поэтому def SaveData(request,ipaddress): и если я использую ваш reg exp для mac-адреса в urls.py('^SaveData/([0-9A-F]{2}[:-]){ 5}([0-9A-F]{2})/',SaveData) это дает мне SaveUserData() принимает ровно 2 аргумента (3 задано) ошибка - person Hunt; 13.03.2011
comment
Вам нужно заключить его в другую пару скобок: ('^SaveData/(?P<macaddr>([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/', SaveData) - person Michal Chruszcz; 13.03.2011
comment
я предполагаю, что ?P‹macaddr› представляет имя аргумента функции, но возможно ли, что мы можем сделать это без указания имени аргумента в urls.py - person Hunt; 13.03.2011
comment
Думаю, да. В этом случае сопоставление URL будет таким: ('^SaveData/(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/', SaveData). - person Michal Chruszcz; 13.03.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})"
person Ben Blank    schedule 13.03.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. Пример можно найти здесь.

person Arun P Johny    schedule 13.03.2011
comment
Регулярное выражение IPv4 неверно, поскольку оно будет принимать значения, которые не являются допустимыми IP-адресами, например. 999.999.999.999. - person Michal Chruszcz; 13.03.2011

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

([0-9A-F]{2}[:-]){5}([0-9A-F]{2})
person ngduc    schedule 13.03.2011
comment
ну, я не знаю, что, но если я использую этот reg exp, то в конечном итоге я получаю AD только для ввода 00-0C-F1-56-98-AD - person Hunt; 13.03.2011
comment
или попробуйте этот: ([a-fA-F0-9]{2}[:|\-]?){6} - person ngduc; 13.03.2011

рассмотрим 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»

person whi    schedule 29.10.2012

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

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

проверено с

127.0.0.1 255.255.255.255

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

person Manish Bansal    schedule 04.11.2014

Мне нужно проверить адрес mac, и я должен принять адрес mac без разделителя и с разделителями двоеточия и тире. Итак, допустимые форматы, подобные этому

  • aa:bb:cc:dd:ee:ff
  • aa-bb-cc-dd-ee-ff
  • ааббкддефф

и смешанные разделители недействительны, как это

  • aa:bb-cc-dd:ee:ff

и проверочный код с регулярным выражением, подобным этому.

def validate_mac_address(mac_addr):
    pattern = '^(([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})|([0-9a-fA-F]{2}[-]){5}([0-9a-fA-F]{2})|[0-9a-fA-F]{12})$'
    return not re.match(pattern, mac_addr) is None
person Ali Katkar    schedule 05.09.2020