鱼C论坛

 找回密码
 立即注册
查看: 1156|回复: 5

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

[复制链接]
发表于 2021-9-2 18:12:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import re
s='192.168.5.12'
pi='(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])'
ru=re.findall(pi,s)
print(ru)

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

请问代码哪里出问题了吗?
最佳答案
2021-9-2 19:59:50
本帖最后由 阿奇_o 于 2021-9-2 20:27 编辑

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

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

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

In [19]: m[0]
Out[19]: '192.168.10.0'

In [20]: m.groups()[0]
Out[20]: '192'

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-2 18:35:18 | 显示全部楼层
(((\d{1,2})|(1\d{2,2})|(2[0-4][0-9])|(25[0-5]))\.){3,3}((\d{1,2})|(1\d{2,2})|(2[0-4][0-9])|(25[0-5]))
试试 这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-2 19:10:34 | 显示全部楼层
你能详细讲一下你这个正则每个匹配的含义吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-2 19:59:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-9-2 20:27 编辑

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

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

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

In [19]: m[0]
Out[19]: '192.168.10.0'

In [20]: m.groups()[0]
Out[20]: '192'

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-2 20:01:22 | 显示全部楼层
本帖最后由 suchocolate 于 2021-9-2 20:05 编辑

得加反捕获组
import re

s = 'aaa 192.168.5.12 bbb'
rex = r'(?:(?:[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}(?:[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])'
result = re.findall(rex, s)
print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-2 23:02:16 | 显示全部楼层
谢谢各位大神,我仔细研究了一下,正则表达式没问题,是re.findall有点问题。用search就没问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表