ipaddress 和 mac 地址的正则表达式
Posted
技术标签:
【中文标题】ipaddress 和 mac 地址的正则表达式【英文标题】:regular expression for ipaddress and mac address 【发布时间】:2011-07-14 07:54:11 【问题描述】:谁能给我推荐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)$
【问题讨论】:
【参考方案1】:我需要进行 MAC 地址验证,并且我必须接受不带分隔符和冒号和破折号分隔符的 MAC 地址。像这样的有效格式
aa:bb:cc:dd:ee:ff aa-bb-cc-dd-ee-ff aabbccddeeff和混合分隔符这样无效
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
【讨论】:
【参考方案2】:好吧,这就是我用于 IPV4 的方法
([0-9]1,3.)3[0-9]1,3
经过测试
127.0.0.1 255.255.255.255
适用于所有人
【讨论】:
【参考方案3】: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'
将此 sn-p 放入您的 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()),
【讨论】:
我有以下函数,所以 def SaveData(request,ipaddress): 如果我在 urls.py 中使用你的 reg exp 作为 mac 地址 ('^SaveData/([0-9A-F] 2[:-])5([0-9A-F]2)/',SaveData) 它给了我 SaveUserData() 正好需要 2 个参数(3 个给定)错误 你需要将它包裹在另一对括号中:('^SaveData/(?P<macaddr>([0-9A-F]2[:-])5([0-9A-F]2))/', SaveData)
我猜 ?P('^SaveData/(([0-9A-F]2[:-])5([0-9A-F]2))/', SaveData)
.【参考方案4】:
考虑 s=256.1.1.1 我想对 Michal 的回答做一点修改:
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 ''
注意 '(^| )' 表示行首或前面的空格,以避免从 '256.1.1.1' 得到 '56.1.1.1'
【讨论】:
【参考方案5】:您可以将/^([0-2]?\d0,2\.)3([0-2]?\d0,2)$/
用于 IPv4 地址,将/^([\da-fA-F]1,4:)7([\da-fA-F]1,4)$/i
用于 IPv6 地址。
您可以将这两者组合为/^((([0-2]?\d0,2\.)3([0-2]?\d0,2))|(([\da-fA-F]1,4:)7([\da-fA-F]1,4)))$/i
。您可以找到示例here。
参考: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
。您可以找到示例here。
【讨论】:
IPv4 正则表达式不正确,因为它将接受不是有效 IP 地址的值,例如999.999.999.999.【参考方案6】:您的正则表达式仅包含两个捕获组(括号),因此它不会存储整个地址(第一个组被“覆盖”)。试试这些:
# 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)"
【讨论】:
迄今为止我发现的最好的解决方案,更容易理解。【参考方案7】:这是 MAC 地址:
([0-9A-F]2[:-])5([0-9A-F]2)
【讨论】:
好吧,我不知道是什么,但如果我使用这个 reg exp,那么最终我只会在 00-0C-F1-56-98-AD 输入中使用 AD 或试试这个:([a-fA-F0-9]2[:|\-]?)6以上是关于ipaddress 和 mac 地址的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章