鱼C论坛

 找回密码
 立即注册
查看: 3265|回复: 3

[已解决]57课正则表达式实践中的问题

[复制链接]
发表于 2016-6-12 17:16:45 | 显示全部楼层 |阅读模式

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

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

x
看了教学视频中取IP地址代码是
re.search(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])', '192.168.1.1')

虽然可以成功取得IP,但是这个代码如果一边写一边测试就会发现有问题,如果只取IP地址的第一段(不加点),那么[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5],这段代码如果取200以上的数值就会出现问题,只能取3位当中的前两位,举例234,只能取到23.换句话说 ,视频中的例子 如果取234.234.234.234,那么只能得到234.234.234.23.
我发现如果调换这个匹配条件是可以解决的我的代码如下
re.search(r'((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)', '234.234.234.234')是可以的.
但是造成这种情况的原因我还是不太明白.
最佳答案
2016-8-15 19:45:28
我认为应该是因为|位于前面的优先。
re.search(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])', '234.234.234.234')中,最后一段[01]{0,1}\d{0,1}\d优先于25[0-5]导致[01]{0,1}\d{0,1}\d取了23,
得到的结果就是234.234.234.23。

而至于为什么前面为什么不是23而是234,是因为前面的格式必须符合"x."
假如是"[01]{0,1}\d{0,1}\d"优先取23了,那么23后面必须紧跟".",但是23后面还有个4,导致"[01]{0,1}\d{0,1}"\d不符合规则,所以紧接着符合规则的"25[0-5])\"优先。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-15 19:45:28 | 显示全部楼层    本楼为最佳答案   
我认为应该是因为|位于前面的优先。
re.search(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])', '234.234.234.234')中,最后一段[01]{0,1}\d{0,1}\d优先于25[0-5]导致[01]{0,1}\d{0,1}\d取了23,
得到的结果就是234.234.234.23。

而至于为什么前面为什么不是23而是234,是因为前面的格式必须符合"x."
假如是"[01]{0,1}\d{0,1}\d"优先取23了,那么23后面必须紧跟".",但是23后面还有个4,导致"[01]{0,1}\d{0,1}"\d不符合规则,所以紧接着符合规则的"25[0-5])\"优先。

评分

参与人数 1荣誉 +20 鱼币 +20 贡献 +10 收起 理由
hldh214 + 20 + 20 + 10 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-8-16 08:11:52 | 显示全部楼层
bajisuan 发表于 2016-8-15 19:45
我认为应该是因为|位于前面的优先。
re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1 ...

python的 正则表达式中 | 表示 关系,和 python的 or 运算符相似,

例如
'A|B|C'
表示:
A or B or C

我们知道,or 运算符 是短路算法的,从左到右,如果A为 True,后面的B、C就不会进行计算。
正则表达式中 | 也是如此,如果A匹配后,B、C则不会进行测试。

--------------------

严谨一点的写法,如下:
import re
ptnIP = re.compile(r'(?<![\d.])' # 前导 无 数字和小数点
                   r'(?:(?:'
                   r'[01]?\d?\d' #   0 ~ 199
                   r'|2[0-4]\d'  # 200 ~ 249
                   r'|25[0-5])'  # 250 ~ 255
                   r'\.){3}'     # 3组 xxx.
                   r'(?:'
                   r'[01]?\d?\d'
                   r'|2[0-4]\d'
                   r'|25[0-5])'
                   r'(?![\d.])'  # 后续 无 数字和小数点
                  )
                  
strIP = ('0.0.0.0'
        ';1.22.333.444'
        ';2.0.0.256'
        ';3.22.33.23333333'
        ';4.2.3.4.5'
        ';5.111.222.99'
        ';6.0.0.0'
        ';7.234.234.234'
        ';255.255.255.255')
        
mch = ptnIP.findall(strIP)
print(mch)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-8-6 17:24:23 | 显示全部楼层
代码看不懂,看的眼痛。理是这么个理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 14:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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