鱼C论坛

 找回密码
 立即注册
查看: 3780|回复: 17

[已解决]一个正则表达式的问题

[复制链接]
发表于 2020-2-21 16:37:04 | 显示全部楼层 |阅读模式

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

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

x
  1. import re
  2. p = r'(\.[0-9]{1,3}){3}'
  3. s = '127.0.0.1 192.168.1.66'
  4. match = re.findall(p, s)
  5. print(match)
复制代码


请问为什么结果是['.1', '.66'],请大佬们指点
最佳答案
2020-2-24 09:05:01
xqq1984 发表于 2020-2-24 08:40
还是没说到点上啊,我就想知道()里为什么输出的是.1,不是第一个.0

类似赋值
分组()里的内容依次是.0    .0   .1
最后()里的是.1   所以输出的是.1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-21 17:04:12 | 显示全部楼层
本帖最后由 沉好人 于 2020-2-21 17:08 编辑
  1. p = r'(\.[0-9]{1,3}){3}'
复制代码

{3}匹配了符合的前面的正则表达式3次
分别是.0  .0  .1
最后一次是.1 然后就输出.1了
.66同理
  1. p = r'(?:\.[0-9]{1,3}){3}'
复制代码

应该是你要的内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 17:10:26 | 显示全部楼层
本帖最后由 yjsx86 于 2020-2-21 17:13 编辑

p = r'(?:\.?\d{1,3}){4}'
findall函数,在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,然后返回这个组的列表; 如果有多个分组,那就把每一个分组看成一个单位,组合为一个元组,然后返回一个含有多个元组的列表。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 17:26:52 | 显示全部楼层
沉好人 发表于 2020-2-21 17:04
{3}匹配了符合的前面的正则表达式3次
分别是.0  .0  .1
最后一次是.1 然后就输出.1了
  1. p = r'(\.[0-9]{1,3}){3}'改成p = r'(\.[0-9]{1,3}){1}'
  2. 结果就是0.0.1了,这个怎么解释
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 17:27:34 | 显示全部楼层
yjsx86 发表于 2020-2-21 17:10
p = r'(?:\.?\d{1,3}){4}'
findall函数,在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,然后返回 ...

用代码验证了括号外面的{3}也起作用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 19:47:40 | 显示全部楼层
  1. import re
  2. p = r'((?:\.[0-9]{1,3}){3})'
  3. s = '127.0.0.1 192.168.1.66'
  4. match = re.findall(p, s)
  5. print(match)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-21 19:58:32 | 显示全部楼层


按你上面的代码改
结果是['.0', '.0', '.1', '.168', '.1', '.66']呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 20:03:24 | 显示全部楼层
沉好人 发表于 2020-2-21 19:58
按你上面的代码改
结果是['.0', '.0', '.1', '.168', '.1', '.66']呀

是啊,我就想不明白这点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 20:17:59 | 显示全部楼层
p = r'(\.[0-9]{1,3}){3}'
{3}相当于需要满足匹配(\.[0-9]{1,3}) 3次
对于127.0.0.1
.0.0.1满足匹配,且findall中加()只会返回()里的内容,所以就返回了'.1'
而{1}仅需要满足匹配(\.[0-9]{1,3}) 1次
.0满足  .0满足  .1满足 就返回'.0' '.0' '.1'
{2}的话就是 .0.0   最后返回的是后一个'.0'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-22 10:43:53 | 显示全部楼层
沉好人 发表于 2020-2-21 20:17
p = r'(\.[0-9]{1,3}){3}'
{3}相当于需要满足匹配(\.[0-9]{1,3}) 3次
对于127.0.0.1
.0.0.1满足匹配,且findall中加()只会返回()里的内容,所以就返回了'.1

为什么返回的不是第一个.0呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 10:48:02 | 显示全部楼层
沉好人 发表于 2020-2-21 20:17
p = r'(\.[0-9]{1,3}){3}'
{3}相当于需要满足匹配(\.[0-9]{1,3}) 3次
对于127.0.0.1

而且{2}的话返回的第一个是.0,第二个是.1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 10:51:06 | 显示全部楼层
  1. import re
  2. p = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
  3. s = '127.0.0.1 192.168.1.66'
  4. match = re.findall(p, s)
  5. print(match)
复制代码


这段代码最外面加了括号打印出来是[('127.0.0.1', '.1'), ('192.168.1.66', '.66')]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 10:51:28 | 显示全部楼层
xqq1984 发表于 2020-2-22 10:48
而且{2}的话返回的第一个是.0,第二个是.1

是的呀,我上面举的只是127.0.0.1
127.0.0.1  匹配.0.0返回.0
192.168.1.66 匹配.168.1 返回.1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 10:53:13 | 显示全部楼层
xqq1984 发表于 2020-2-22 10:43
为什么返回的不是第一个.0呢

因为满足匹配的是 .0.0
最后在分组()里的是后一个.0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 08:22:33 | 显示全部楼层
沉好人 发表于 2020-2-22 10:51
是的呀,我上面举的只是127.0.0.1
127.0.0.1  匹配.0.0返回.0
192.168.1.66 匹配.168.1 返回.1

为毛匹配的的是两个,返回的是一个呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 10:40:01 | 显示全部楼层
xqq1984 发表于 2020-2-23 08:22
为毛匹配的的是两个,返回的是一个呢

因为findall只会返回分组()里的内容,{3}不在分组内
想要()不是分组的作用就要用(?:)
你试着这样p = r'((\.[0-9]{1,3}){3})'
会输出('.0.0.1', '.1')
'.0.0.1'是最外的分组()里的内容
'.1'是里面的()的内容,就是你原来正则式输出的内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 08:40:32 | 显示全部楼层
沉好人 发表于 2020-2-23 10:40
因为findall只会返回分组()里的内容,{3}不在分组内
想要()不是分组的作用就要用(?:)
你试着这样p = r' ...

还是没说到点上啊,我就想知道()里为什么输出的是.1,不是第一个.0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 09:05:01 | 显示全部楼层    本楼为最佳答案   
xqq1984 发表于 2020-2-24 08:40
还是没说到点上啊,我就想知道()里为什么输出的是.1,不是第一个.0

类似赋值
分组()里的内容依次是.0    .0   .1
最后()里的是.1   所以输出的是.1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-2 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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