IPAddress或CIDR块匹配正则表达式

tig*_*nk2 1 python regex

我需要检查字符串是否有任何IPv4地址或以下CIDR块之一:/ 16或/ 24.所以,192.168.0.1应该匹配.192.168.0.0/16应匹配.192.168.0.0/17不匹配我正在使用以下正则表达式:

re.compile(r'^([0-9]{1,3}\.){3}[0-9]{1,3}(/(16|24))?')
Run Code Online (Sandbox Code Playgroud)

这匹配所有IP地址,但也匹配192.168.0.0/aaaa等字符串

现在,如果我更改正则表达式(删除?结尾):

re.compile(r'^([0-9]{1,3}\.){3}[0-9]{1,3}(/(16|24))')
Run Code Online (Sandbox Code Playgroud)

它匹配CIDR块/ 16或/ 24,但不再匹配IP地址(例如,192.168.0.1).

不是'?' 应该检查一个组是否有可选的发生?我究竟做错了什么?

注意:我知道IP地址正则表达式本身并不完美,但我更感兴趣的是获得有关所述问题的帮助.

sQV*_*QVe 7

这应该工作:

^([0-9]{1,3}\.){3}[0-9]{1,3}($|/(16|24))$
Run Code Online (Sandbox Code Playgroud)

它检查$(线端)或/1624.

就像你说的那样将?一个组标记为可选组,这意味着如果可能的话,它将尝试将其包含在匹配中.但在某些情况下,它不喜欢192.168.0.0/aaaa,但因为它是可选的,它仍然会匹配其他部分.

这就是为什么上述正则表达式更适合您的需求.这样,如果它最终要么你只会得到一个匹配/24,/16行尾如.192.168.0.1.


mmd*_*bas 5

精准匹配

匹配0.0.0.0通过255.255.255.255. 如果指定了 CIDR 块,则仅当 CIDR 为16或 时才匹配24行动中

^                                                 # Start string
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # A in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # B in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # C in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)($|/(16|24))?    # D in A.B.C.D and /16 or /24
$                                                 # End string
Run Code Online (Sandbox Code Playgroud)