mac地址由6組十六進制數組成,每組2字符,用冒號或連字符分隔,如00:1a:2b:3c:4d:5e或00-1a-2b-3c-4d-5e。1. 使用正則表達式匹配時,基本結構為([0-9a-fa-f]{2}[:-]){5}([0-9a-fa-f]{2});2. 為增強魯棒性,推薦加上單詞邊界b和忽略大小寫標志re.ignorecase;3. 若需支持windows格式如001a.2b3c.4d5e,可擴展為支持點號分隔的模式;4. 可通過函數封裝實現靈活驗證多種mac地址格式。
MAC地址由6組十六進制數組成,每組2個字符,通常用冒號(:)或連字符(-)分隔。例如:00:1A:2B:3C:4D:5E 或 00-1A-2B-3C-4D-5E。
要使用 python 正則表達式匹配 MAC 地址,關鍵在于準確描述這些格式特征。
基本結構:識別十六進制對和分隔符
MAC 地址的基本組成單位是兩個十六進制字符(0-9、a-f、A-F),后面跟一個分隔符(通常是冒號或連字符),共五次,最后一組沒有分隔符。
立即學習“Python免費學習筆記(深入)”;
正則片段示例:
([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})
說明:
- [0-9A-Fa-f]{2} 匹配兩位十六進制數
- [:-] 表示冒號或連字符
- {5} 表示前一部分重復5次
- 最后再加上一組十六進制數完成整個地址匹配
這個模式可以匹配大部分標準格式的 MAC 地址。
支持多種格式:處理不同寫法和邊界情況
有時候 MAC 地址可能有不同大小寫組合,或者出現在字符串中間,比如日志中。為了提高魯棒性,建議:
- 使用不區分大小寫的標志 re.IGNORECASE
- 加上單詞邊界 b 避免匹配到更長的字符串中的一部分
完整推薦模式:
b([0-9A-F]{2}[:-]){5}[0-9A-F]{2}b
加上標志:
import re pattern = re.compile(r'b([0-9A-F]{2}[:-]){5}[0-9A-F]{2}b', re.IGNORECASE)
這樣就可以匹配:
- 00:1a:2b:3c:4d:5e
- 00-1A-2B-3C-4D-5E
- 001A.2B3C.4D5E(如果稍作調整支持點號)
擴展技巧:如何提取和驗證多個格式?
有些系統(如 windows)顯示 MAC 地址時會使用點號(.)分隔,如 001A.2B3C.4D5E。如果你也需要支持這種格式,可以把分隔符部分改為可選的多個字符:
b(?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2}b|b(?:[0-9A-F]{4}.){2}[0-9A-F]{4}b
說明:
- 第一部分是冒號/連字符格式
- 第二部分是每四字符一點號的格式
- 用 | 表示“或”的關系
也可以用函數封裝驗證邏輯,比如:
def is_valid_mac(mac): pattern = re.compile(r""" ( (?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2} )|( (?:[0-9A-F]{4}.){2}[0-9A-F]{4} ) """, re.IGNORECASE | re.VERBOSE) return bool(pattern.fullmatch(mac))
這樣你就可以靈活判斷各種格式的 MAC 地址了。
基本上就這些。正則寫 MAC 地址不算復雜,但要注意邊界、格式差異和大小寫問題。