鱼C论坛

 找回密码
 立即注册
查看: 1343|回复: 9

[已解决]子组不捕获匹配的内容--结果与实际不符呢

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

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

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

x
import urllib.request
import re

def open_url(url):
    req = urllib.request.Request(url) # urllib.request.Request讲解见14.2.1、14.3.1,举例见p14_4.py、p14_5.py
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36') # add_header讲解见14.3.1,举例见爬取猪八戒词条
    response = urllib.request.urlopen(req)
    #response
    #print(response)
    html = response.read().decode('utf-8')

    return html

def get_img(html):
    p = r'(?:(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])' # ip由四段数字组成:XXX.XXX.XXX.XXX
    iplist = re.findall(p, html)
   
    for each in iplist:
        print(each)
   
        
if __name__ == '__main__': # 见13.4(P147-149)
    url = 'https://proxy.seofangfa.com'
    get_img(open_url(url)) # 看不懂???!!!

运行后获得:

36.134.91.82
117.157.197.18
103.59.151.99
111.23.16.25
203.34.48.10
45.189.254.70
43.255.113.23
43.255.113.23
43.255.113.23
43.255.113.23

与实际网页对比如下:

123.png

红框处不同,是不是正则表达式有错造成的呢?完全按小甲鱼教学视频上敲的哦
最佳答案
2022-5-5 20:40:52
lzb1001 发表于 2022-5-5 20:11
最后一段的第一个数字换成逗号?

没看懂是指哪一段的第一个数字,请明示,谢谢大神


>>> import re
>>> p = r'(?:(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)'
>>> re.match(p, "103.133.177.,41")
<re.Match object; span=(0, 15), match='103.133.177.,41'>
>>> p = r'(?:(?:2[0-4]\d|25[0-5]|[01]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[01]?\d?\d)'
>>> re.match(p, "103.133.177.,41")
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-5 06:19:59 | 显示全部楼层
本帖最后由 isdkz 于 2022-5-5 11:16 编辑

这个正则表达式确实有点问题,

因为第一种情况 [0,1]?\d?\d 可以匹配两位且第一位不是 0,1开头的,

250 就不是 以 0、1 开头的,所以只匹配了两位就不匹配了,你可以把正则的位置换一下

对你的代码修改如下:
import urllib.request
import re

def open_url(url):
    req = urllib.request.Request(url) # urllib.request.Request讲解见14.2.1、14.3.1,举例见p14_4.py、p14_5.py
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36') # add_header讲解见14.3.1,举例见爬取猪八戒词条
    response = urllib.request.urlopen(req)
    #response
    #print(response)
    html = response.read().decode('utf-8')

    return html

def get_img(html):
    p = r'(?:(?:[01]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:2[0-4]\d|25[0-5]|[01]?\d?\d)' # 改了这里最后一段的位置,把 [01]?\d?\d 放到最后
    iplist = re.findall(p, html)
   
    for each in iplist:
        print(each)
   
        
if __name__ == '__main__': # 见13.4(P147-149)
    url = 'https://proxy.seofangfa.com'
    get_img(open_url(url)) # 看不懂???!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-5 10:54:30 | 显示全部楼层
isdkz 发表于 2022-5-5 06:19
这个正则表达式确实有点问题,

因为第一种情况 [0,1]?\d?\d 可以匹配两位且第一位不是 0,1开头的,

感谢,按大神指点的修改后确实可以了。

不过我想继续问下:

大神你说:因为第一种情况 [0,1]?\d?\d 可以匹配两位且第一位不是 0,1开头的,

而我记得小甲鱼在教材里14.5.4说:[01]\d\d表示可以匹配0或1开头的

所以我想问的是:

1、 [0,1]?\d?\d 是不是应该等同于[01]?\d?\d

2、如果等同的话,大神的说法不是和小甲鱼的说法不一致了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-5 11:15:38 | 显示全部楼层
lzb1001 发表于 2022-5-5 10:54
感谢,按大神指点的修改后确实可以了。

不过我想继续问下:

[0,1]?\d?\d 不等同于 [01]?\d?\d 也不等同于 [01]\d\d,
[0,1]比 [01] 多出一个 逗号字符,


在中括号里表示范围应该用 -,即 [0-1]?\d?\d
等同于 [01]?\d?\d,

那个 ?表示匹配 0 次或 1 次,

也就是说 0 或 1 不一定要匹配上,这时候就少了 1 位,

也就是说 [0-1]?\d?\d 除了可以匹配以0或1开头的三位数以外,

还可以匹配不以0或1开头的两位数,

这样的话就没有后边的 2[0-4]\d 或 25[0-5]  什么事了,

他匹配够两位就不继续往下匹配了,

所以我换了一下顺序,先看 2[0-4]\d 或 25[0-5] 能不能匹配上,

再来看 [01]?\d?\d
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-5 11:56:21 | 显示全部楼层
本帖最后由 lzb1001 于 2022-5-5 12:00 编辑
isdkz 发表于 2022-5-5 11:15
[0,1]?\d?\d 不等同于 [01]?\d?\d 也不等同于 [01]\d\d,
[0,1]比 [01] 多出一个 逗号字符,


有点绕,三个的区别看晕了,整理下:

                      等同于             表示含义
[0,1]\d\d                  ?                    可以匹配两位且第一位不是 0,1开头的?

[01]\d\d             [0-1]\d\d                  ?

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

使用道具 举报

发表于 2022-5-5 12:06:14 | 显示全部楼层
lzb1001 发表于 2022-5-5 11:56
有点绕,三个的区别看晕了,整理下:

                      等同于             表示含义



[01]\d\d 等同于 [0-1]\d\d,

而 [0,1]\d\d 中的 “,” 就是一个普通的逗号字符,所以除了 0 或 1 还可以匹配逗号,

是 [01]?\d?\d 可以匹配两位数字且第一位不是 0,1开头的,

关于正则表达式中 “?” 的用法你可以去查一下,

正则表达式是需要系统地去学习的,刚开始接触可能确实不太好理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-5 12:08:09 | 显示全部楼层
本帖最后由 lzb1001 于 2022-5-5 12:09 编辑

三种表达式运行的结果为什么都一样?更晕了:


第一种:p = r'(?:(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)'
103.133.177.141
47.115.6.196
183.247.194.203
175.178.89.245
39.174.28.139
45.167.89.93
112.78.14.152
112.78.14.4
181.129.2.90
112.78.14.23

第二种:p = r'(?:(?:2[0-4]\d|25[0-5]|[01]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[01]?\d?\d)'

103.133.177.141
47.115.6.196
183.247.194.203
175.178.89.245
39.174.28.139
45.167.89.93
112.78.14.152
112.78.14.4
181.129.2.90
112.78.14.23

第三种:p = r'(?:(?:2[0-4]\d|25[0-5]|[0-1]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[0-1]?\d?\d)'

103.133.177.141
47.115.6.196
183.247.194.203
175.178.89.245
39.174.28.139
45.167.89.93
112.78.14.152
112.78.14.4
181.129.2.90
112.78.14.23

第二种和第三种的写法其实是一样的,对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-5 17:43:46 | 显示全部楼层
lzb1001 发表于 2022-5-5 12:08
三种表达式运行的结果为什么都一样?更晕了:

嗯嗯,第二种和第三种是一样的,

而 第一种可以匹配逗号字符,也就是说你这里没有逗号自然没有区别了,

你把最后一段的第一个数字换成逗号你就可以看出区别了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-5 20:11:23 | 显示全部楼层
isdkz 发表于 2022-5-5 17:43
嗯嗯,第二种和第三种是一样的,

而 第一种可以匹配逗号字符,也就是说你这里没有逗号自然没有区别了 ...

最后一段的第一个数字换成逗号?

没看懂是指哪一段的第一个数字,请明示,谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-5 20:40:52 | 显示全部楼层    本楼为最佳答案   
lzb1001 发表于 2022-5-5 20:11
最后一段的第一个数字换成逗号?

没看懂是指哪一段的第一个数字,请明示,谢谢大神


>>> import re
>>> p = r'(?:(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[0,1]?\d?\d)'
>>> re.match(p, "103.133.177.,41")
<re.Match object; span=(0, 15), match='103.133.177.,41'>
>>> p = r'(?:(?:2[0-4]\d|25[0-5]|[01]?\d?\d)\.){3}(?:2[0-4]\d|25[0-5]|[01]?\d?\d)'
>>> re.match(p, "103.133.177.,41")
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 12:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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