【问题标题】:regular expression for ipaddress and mac addressipaddress 和 mac 地址的正则表达式
【发布时间】: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})$

【问题讨论】:

    标签: python regex ip-address mac-address


    【解决方案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]?\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。您可以找到示例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}
          猜你喜欢
          • 1970-01-01
          • 2022-01-13
          • 2016-12-15
          • 2011-05-14
          • 1970-01-01
          • 2023-01-12
          • 2014-07-14
          • 2015-11-22
          • 1970-01-01
          相关资源
          最近更新 更多