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&lt;macaddr&gt;([0-9A-F]2[:-])5([0-9A-F]2))/', SaveData) 我猜 ?P 代表函数的参数名称,但是我们是否可以在不指定 urls.py 中的参数名称的情况下做到这一点 我猜是的。在这种情况下,url 映射如下:('^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 地址的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于从电子邮件标头获取 IP 地址的正则表达式 [重复]

正则表达式 - IP地址Mac地址端口经纬度车牌号码校验

PHP 使用正则表达式对Zend Validate进行Mac地址验证

正则表达式

正则 常用表达式

Power BI R 脚本正则表达式仅返回第一个匹配项