鱼C论坛

 找回密码
 立即注册
查看: 1148|回复: 14

[已解决]关于re.search的匹配问题

[复制链接]
发表于 2018-7-25 13:17:32 | 显示全部楼层 |阅读模式

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

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

x
  1. 就是去匹配ip地址,为什么输入292.168.1.1会匹配92.168.1.1
  2. 他的匹配原理是怎样的。求告知,不是很清楚。
  3. 在我看来292不满足任何一个匹配项啊。
  4. 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] )','292.168.1.1')
复制代码
最佳答案
2018-7-26 11:16:35

跟这个没关系吧,我认为应该是因为search是搜索,只要有符合条件的字符串(哪怕在我们看来是一个连续字符串的一部分)就会被匹配。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-25 14:52:23 | 显示全部楼层
因为前面[01]{0,1}是一个可选项(注意:[01]好像少了个2),后面匹配一位可选数字一位不可选数字。(这里你没有考虑到2xx时xx每一位最大是5)
给你个思路:
用|符号:
要么匹配第一位0~2,第二位0~5,第三位0~5,要么匹配两个数字(前面的匹配0~1次)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 16:04:55 | 显示全部楼层
re.search(r'( ( [01]{0,2}\d{0,2}\d|2[0-9]\d|25[0-9])\. ){3} ( [01]{0,2}\d{0,2}\d|2[0-9]\d|9[0-9] )','999.999.999.999')
试试这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:26:31 | 显示全部楼层
无符号整形 发表于 2018-7-25 14:52
因为前面[01]{0,1}是一个可选项(注意:[01]好像少了个2),后面匹配一位可选数字一位不可选数字。(这里你 ...

[01]{0,1}\d{0,1}\d ,[01]{0,1}的意思不是说去匹配0或者1出现0次或者1次嘛,那么其他数字3,5,6,8这些数据应该是不能匹配的啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 18:28:03 | 显示全部楼层
小小小小的鱼丶 发表于 2018-7-25 18:26
[01]{0,1}\d{0,1}\d ,[01]{0,1}的意思不是说去匹配0或者1出现0次或者1次嘛,那么其他数字3,5,6,8这些数 ...

[01]少了2,然后\d可以匹配1,2,3,4,5,6,7,8,9,0。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 21:33:30 | 显示全部楼层
无符号整形 发表于 2018-7-25 18:28
[01]少了2,然后\d可以匹配1,2,3,4,5,6,7,8,9,0。

意思是说第一个数字2,然后我前面【01】{0,1}匹配不到,因为是可选的,所以系统自动给出的值是true。然后后面\d{0,1}\d再匹配9和2嘛。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 21:48:31 | 显示全部楼层
本帖最后由 无符号整形 于 2018-7-25 22:03 编辑
小小小小的鱼丶 发表于 2018-7-25 21:33
意思是说第一个数字2,然后我前面【01】{0,1}匹配不到,因为是可选的,所以系统自动给出的值是true。然后 ...


哦,对对,我看错了。。。
它是这样子的:
先寻找|前面的条件,然后发现不符合,就寻找后面的,发现后面的也不符合,就忽略掉2
然后再用92.168.1.1尝试符合|前面的条件,成功。
最后就匹配出92.168.1.1。。。
我还在想办法,似乎match可以做出正确的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 22:01:58 | 显示全部楼层
本帖最后由 无符号整形 于 2018-7-25 22:02 编辑

我试了一下,好像match就没问题。
  1. >>> re.match('(([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])','122.168.1.1')
  2. <_sre.SRE_Match object; span=(0, 11), match='122.168.1.1'>
  3. >>> re.match('(([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])','262.168.1.1')
  4. >>> re.match('(([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])','292.168.1.1')
  5. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 22:18:43 | 显示全部楼层
还有个bug,正在寻找对策。。。
  1. re.search('(([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])','092.168.1.1')
复制代码

匹配成功???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 08:46:50 | 显示全部楼层
貌似没办法,连断言都没法用,还是用match吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 11:08:52 | 显示全部楼层
无符号整形 发表于 2018-7-25 21:48
哦,对对,我看错了。。。
它是这样子的:
先寻找|前面的条件,然后发现不符合,就寻找后面的,发现 ...

就是贪心原则吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 11:10:39 | 显示全部楼层
无符号整形 发表于 2018-7-26 08:46
貌似没办法,连断言都没法用,还是用match吧。。。

哈哈,谢谢老哥了。新手初学python觉得鱼c真的很友好啊~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 11:16:35 | 显示全部楼层    本楼为最佳答案   

跟这个没关系吧,我认为应该是因为search是搜索,只要有符合条件的字符串(哪怕在我们看来是一个连续字符串的一部分)就会被匹配。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 11:20:58 | 显示全部楼层
无符号整形 发表于 2018-7-26 11:16
跟这个没关系吧,我认为应该是因为search是搜索,只要有符合条件的字符串(哪怕在我们看来是一个连续字符 ...

呃呃,好吧,对search的匹配机制有点晕。。按道理说匹配字符串不应该就是匹配整个字符串嘛。整个能匹配子串有点骚。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 11:22:46 | 显示全部楼层
小小小小的鱼丶 发表于 2018-7-26 11:20
呃呃,好吧,对search的匹配机制有点晕。。按道理说匹配字符串不应该就是匹配整个字符串嘛。整个能匹配子 ...

然而,就是如此的骚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 10:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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