鱼C论坛

 找回密码
 立即注册
查看: 1662|回复: 4

Python零基础 正则表达式 请各位前辈帮忙解释一下,谢谢

[复制链接]
发表于 2022-5-24 01:31:03 | 显示全部楼层 |阅读模式

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

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

x
>>> s1 = re.findall(r'(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([0,1]?\d?\d|2[0-4]\d|25[0-5])','204.192.168.1')
>>> s1
[('168.', '168', '1')]

想知道,[('168.', '168', '1')],这个结果

是r'(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([0,1]?\d?\d|2[0-4]\d|25[0-5])'  这个部分怎么匹配出来的?

我的理解是:(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3},这个部分以([0,1]?\d?\d|2[0-4]\d|25[0-5])\.为分组,整体匹配了3次

而([0,1]?\d?\d|2[0-4]\d|25[0-5]) 这个里面是 或的关系,可以匹配9或者244或者251或者99或者199

如果是这样的话,那为什么匹配出来的结果,不是我想要的那种

谢谢指教

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

使用道具 举报

 楼主| 发表于 2022-5-24 11:26:42 | 显示全部楼层
走过路过的,如果知道的,希望你能帮忙解答一下,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 16:07:41 | 显示全部楼层
正则表达式是一个非常强大的工具,但在有些时候它并不能直观地按照你的意愿来运行。
出现这样的情况,我的理解是每个小括号代表一个子组,3个小括号,findall误认为有三个子组
findall():返回的是所有groups的列表,就是group组成的元组的列表,母串中的这一撮组成一个元组,那一撮组成一个元组,这些元组共同构成一个list。举个例子:
>>> s = '23432werwre2342werwrew'
>>> p = r'(\d*)([a-zA-Z]*)'
>>> m = re.findall(p,s)
>>> print(m)
[('23432', 'werwre'), ('2342', 'werwrew'), ('', '')]
>>> s='1113446777'  
>>> m = re.findall(r'(\d)\1*',s)  
>>> print(m)  
['1', '3', '4', '6', '7'] 
你可以这样改:
s = '204.192.168.1'
p = re.compile(r'(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([0,1]?\d?\d|2[0-4]\d|25[0-5])')
m = p.match(s) 或者 m = p.search(s)
print(m)
这里有个bug,200以上的数字会截取前两位,20会满足 [0,1]?\d?\d 中的 \d?\d 直接输出,所以要将匹配200以上的语句放在前面就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-24 22:46:13 | 显示全部楼层
来自星星的小明 发表于 2022-5-24 16:07
正则表达式是一个非常强大的工具,但在有些时候它并不能直观地按照你的意愿来运行。
出现这样的情况,我的 ...

谢谢你的答复!!

[0,1]?\d?\d 中的 \d?\d 直接输出

你说的这个情况我之前也发现了,你说的findall误认为有三个子组我也明白

只是,我搞不懂这三个子组是怎样和IP地址匹配的,例如192.120.58.245

哪个子组匹配哪个部分你可以说一下吗?有点懵

第二个懵的地方就是,关于(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3},这个部分重复操作3次,应该怎么理解呢?

这重复操作3次,对应IP地址是对应了哪里?

不吝赐教,再次感谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-25 10:17:05 | 显示全部楼层
>>> str = '192.120.58.245'
>>> p1 = r'((\d*)\.)(\d*)'
>>> re.findall(p1,str)
[('192.', '192', '120'), ('.', '', '58'), ('.', '', '245')]
>>> p2 = r'((\d*)\.){1}(\d*)'
>>> re.findall(p2,str)
[('192.', '192', '120'), ('.', '', '58'), ('.', '', '245')]
>>> p3 = r'((\d*)\.){2}(\d*)'
>>> re.findall(p3,str)
[('120.', '120', '58')]
>>> p4 = r'((\d*)\.){3}(\d*)'
>>> re.findall(p4,str)
[('58.', '58', '245')]
这样你能看懂不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 00:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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