我需要检查字符串是否有任何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地址正则表达式本身并不完美,但我更感兴趣的是获得有关所述问题的帮助.
这应该工作:
^([0-9]{1,3}\.){3}[0-9]{1,3}($|/(16|24))$
Run Code Online (Sandbox Code Playgroud)
它检查$(线端)或/与16或24.
就像你说的那样将?一个组标记为可选组,这意味着如果可能的话,它将尝试将其包含在匹配中.但在某些情况下,它不喜欢192.168.0.0/aaaa,但因为它是可选的,它仍然会匹配其他部分.
这就是为什么上述正则表达式更适合您的需求.这样,如果它最终要么你只会得到一个匹配/24,/16或行尾如.192.168.0.1.
匹配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)
| 归档时间: |
|
| 查看次数: |
5411 次 |
| 最近记录: |