benyazi 发表于 2021-9-2 18:12:29

正则表达式IP地址的匹配,这样为什么不成功

import re
s='192.168.5.12'
pi='(({0,1}\d{0,1}\d|2\d|25)\.){3}({0,1}\d{0,1}\d|2\d|25)'
ru=re.findall(pi,s)
print(ru)

执行出来不对
[('5.', '5', '12')]

请问代码哪里出问题了吗?

xiaosi4081 发表于 2021-9-2 18:35:18

(((\d{1,2})|(1\d{2,2})|(2)|(25))\.){3,3}((\d{1,2})|(1\d{2,2})|(2)|(25))
试试 这样

江湖散人 发表于 2021-9-2 19:10:34

你能详细讲一下你这个正则每个匹配的含义吗?

阿奇_o 发表于 2021-9-2 19:59:50

本帖最后由 阿奇_o 于 2021-9-2 20:27 编辑

为啥搞哪样复杂,为了练习正则表达式?
还不如只区分是否为数字就行了,是否0~255的判断,取出来之后单独来判断,方便得多
In : ip = "192.168.10.0"

In : m = re.fullmatch("(\d+).(\d+).(\d+).(\d+)", ip)

In : m.groups()
Out: ('192', '168', '10', '0')

In : m
Out: '192.168.10.0'

In : m.groups()
Out: '192'

修改:
网上有现成的:
pt = "((?:(?:25|2\\d|?\\d?\\d)\\.){3}(?:25|2\\d|?\\d?\\d))"
部分解释:
   先分为前三段和最后一段,前三段是 xxx.   最后段没有点;
   数值的可能 25开头的(250-255),2开头的(200-249),0-199的合并为 ?\\d?\\d(0-199可能1位数或2位数3位数,问号代表0个或1个)
    ?:这用法,我也搞不太清楚,据说用于这样子的 (?:...){3} 括号在这里不分组,并在后面接有多少个这样的模式

suchocolate 发表于 2021-9-2 20:01:22

本帖最后由 suchocolate 于 2021-9-2 20:05 编辑

得加反捕获组
import re

s = 'aaa 192.168.5.12 bbb'
rex = r'(?:(?:{0,1}\d{0,1}\d|2\d|25)\.){3}(?:{0,1}\d{0,1}\d|2\d|25)'
result = re.findall(rex, s)
print(result)

benyazi 发表于 2021-9-2 23:02:16

谢谢各位大神,我仔细研究了一下,正则表达式没问题,是re.findall有点问题。用search就没问题了。
页: [1]
查看完整版本: 正则表达式IP地址的匹配,这样为什么不成功