鱼C论坛

 找回密码
 立即注册
查看: 3483|回复: 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])\"优先。
小甲鱼最新课程 -> https://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^_^

查看全部评分

小甲鱼最新课程 -> https://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则不会进行测试。

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

严谨一点的写法,如下:
  1. import re
  2. ptnIP = re.compile(r'(?<![\d.])' # 前导 无 数字和小数点
  3.                    r'(?:(?:'
  4.                    r'[01]?\d?\d' #   0 ~ 199
  5.                    r'|2[0-4]\d'  # 200 ~ 249
  6.                    r'|25[0-5])'  # 250 ~ 255
  7.                    r'\.){3}'     # 3组 xxx.
  8.                    r'(?:'
  9.                    r'[01]?\d?\d'
  10.                    r'|2[0-4]\d'
  11.                    r'|25[0-5])'
  12.                    r'(?![\d.])'  # 后续 无 数字和小数点
  13.                   )
  14.                   
  15. strIP = ('0.0.0.0'
  16.         ';1.22.333.444'
  17.         ';2.0.0.256'
  18.         ';3.22.33.23333333'
  19.         ';4.2.3.4.5'
  20.         ';5.111.222.99'
  21.         ';6.0.0.0'
  22.         ';7.234.234.234'
  23.         ';255.255.255.255')
  24.         
  25. mch = ptnIP.findall(strIP)
  26. print(mch)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-8-6 17:24:23 | 显示全部楼层
代码看不懂,看的眼痛。理是这么个理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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